From 9947a969f5f0e2198b56ed74a6de5e5017226f9b Mon Sep 17 00:00:00 2001 From: Wei Ji Date: Sat, 5 Oct 2019 16:39:02 +1300 Subject: [PATCH 1/5] Wrap colorbar Initial commit for wrapping the colorbar function raised first at #109 but also #231, to be implemented under base_plotting.py alongside the other mapping related stuff. Original GMT `colorbar` documentation can be found at https://docs.generic-mapping-tools.org/latest/colorbar.html. Storing sample test cases under test_colorbar.py. Current implementation has an alias for position (D) which is arguably the most important one. and the one we've focused writing the tests for. Also wrapped around common aliases region (R), projection (J), frame (B) and cmap (C). --- doc/api/index.rst | 1 + pygmt/base_plotting.py | 43 +++++++++++++ ...ar_positioned_using_justification_code.png | Bin 0 -> 18104 bytes ...orbar_positioned_using_map_coordinates.png | Bin 0 -> 19113 bytes ...bar_positioned_using_normalized_coords.png | Bin 0 -> 18943 bytes .../test_colorbar_using_paper_coordinates.png | Bin 0 -> 1183 bytes ...bar_using_paper_coordinates_horizontal.png | Bin 0 -> 989 bytes pygmt/tests/test_colorbar.py | 59 ++++++++++++++++++ 8 files changed, 103 insertions(+) create mode 100644 pygmt/tests/baseline/test_colorbar_positioned_using_justification_code.png create mode 100644 pygmt/tests/baseline/test_colorbar_positioned_using_map_coordinates.png create mode 100644 pygmt/tests/baseline/test_colorbar_positioned_using_normalized_coords.png create mode 100644 pygmt/tests/baseline/test_colorbar_using_paper_coordinates.png create mode 100644 pygmt/tests/baseline/test_colorbar_using_paper_coordinates_horizontal.png create mode 100644 pygmt/tests/test_colorbar.py diff --git a/doc/api/index.rst b/doc/api/index.rst index 3b2a4aeab6d..092d01ce8c5 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -24,6 +24,7 @@ Plotting data and laying out the map: Figure.basemap Figure.coast + Figure.colorbar Figure.plot Figure.contour Figure.grdcontour diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 6c739ff690e..4bbf0c7225b 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -125,6 +125,49 @@ def coast(self, **kwargs): with Session() as lib: lib.call_module("coast", build_arg_string(kwargs)) + @fmt_docstring + @use_alias(R="region", J="projection", B="frame", C="cmap", D="position") + @kwargs_to_strings() + def colorbar(self, **kwargs): + """ + Plot a gray or color scale-bar on maps. + + Both horizontal and vertical scales are supported. For CPTs with gradational + colors (i.e., the lower and upper boundary of an interval have different colors) + we will interpolate to give a continuous scale. Variations in intensity due to + shading/illumination may be displayed by setting the option -I. Colors may be + spaced according to a linear scale, all be equal size, or by providing a file + with individual tile widths. + + Full option list at :gmt-docs:`colorbar.html` + + Parameters + ---------- + position (D) : str + ``[g|j|J|n|x]refpoint[+wlength[/width]][+e[b|f][length]][+h|v][+jjustify] + [+m[a|c|l|u]][+n[txt]][+odx[/dy]]``. + Defines the reference point on the map for the color scale using one of four + coordinate systems: + (1) Use -Dg for map (user) coordinates, + (2) use -Dj or -DJ for setting refpoint via a 2-char justification code that + refers to the (invisible) map domain rectangle, + (3) use -Dn for normalized (0-1) coordinates, or + (4) use -Dx for plot coordinates (inches, cm, etc.).\ + All but -Dx requires both -R and -J to be specified. + Append +w followed by the length and width of the color bar. + If width is not specified then it is set to 4% of the given length. + Give a negative length to reverse the scale bar. + Append +h to get a horizontal scale [Default is vertical (+v)]. + By default, the anchor point on the scale is assumed to be the bottom left + corner (BL), but this can be changed by appending +j followed by a 2-char + justification code justify. + + {aliases} + """ + kwargs = self._preprocess(**kwargs) + with Session() as lib: + lib.call_module("colorbar", build_arg_string(kwargs)) + @fmt_docstring @use_alias( A="annotation", diff --git a/pygmt/tests/baseline/test_colorbar_positioned_using_justification_code.png b/pygmt/tests/baseline/test_colorbar_positioned_using_justification_code.png new file mode 100644 index 0000000000000000000000000000000000000000..7f26712d622f469b5e068dd3c329b851b00ec739 GIT binary patch literal 18104 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 U_IaQti2DF3ae1-QcOO6hKbS1&j{pDw literal 0 HcmV?d00001 diff --git a/pygmt/tests/baseline/test_colorbar_positioned_using_map_coordinates.png b/pygmt/tests/baseline/test_colorbar_positioned_using_map_coordinates.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ccbfb9f3b25d03d0418a59911a96da6e6cadc4 GIT binary patch literal 19113 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�If>Rd@8 zdg_|~nvM)No%Wxbi`X8Su%Z6;?hFwcuz!zw`q^nPt2Lu<$C=0-`XOoH9StE?T(CFj z9((duhvOb72{as3=hFCXPPSiu&=rm(d}9|nV%gQB(VdFt+g6YJz%{Cq%^==%n`+w2 z4sZmf1*8jQ#dG-Z4NwaAOl4+SgB@LMGlOz5L>x7m1MO$~L{*2_n>RvXx!SzmfyX61 zyNFIa3nv!t!|XmJyKX;&&P%$3!GAZFmA=1}aS4>Hx)ci2cAVayTpn19BObashT{=~ zafqdi#OCgoyU0J92`5_nn5t7`Lmru|kapY;yWD>tekfln(Tls27|YAQCpeJb*;T%L zq?wH=TdnFISt$|(MQ8O6gk8pHqV%M5~W4aBFD?TX74DSIRV&sM^__!(UT)46CWM_a0kz}sKCJOZTx~N}b0skV@8h*s<0NO9{5!QULjne=u9ih_kr6Jl z;?X9#SZzFp>K7t+7i$2vwt^t`517dm?4i?tXN-l!uJw}}GuIu~V~AwzyXe&mY-0P( z#?S~2`h8c~M_qs53TyyZz%ow0s#Y#%Pjg3+P`x|3V?Dm~=W4x`cA}W|y}Nm9n)ove z3`U_^e$J$a~-s(xr^kwq1)j-_RsE;qV;NpX(1dp%F1hbSse$uxau2ML_BTmH_Yg=SGMU1hI4o-HFDNRo|zSvK^p zi`$c(ip|W@C%R}SlEdCO+0Au6e2c}okZq{I0q=1@1X0=zxt;2faJqSG6uYb!G7xGW z(rP9R8W2cl_ZcS;#jA@$<0MoYWL*KPx_$GxbmC*D7R>Z1<$_4BcF+kbZp4PHBK!wj5>?~ z?rCdzJW^S}F}?-TdI3fwUrB_}Q0Tl#JmYZ)B-X;)uJ?mRv;j@8ZZcpKTVOM#c-Gub zgL2QUC<@6|)jeH{evHwDmDo7>E!BE@V4A)MGWF`hfa+c-ncwSPrtrH5?X<59hk8OKMMHkN23$+ks4`H zP6j1hbmeMJ^f+>+OyLYsuYM$spb%;7uY&R+gHT^Wi?Reav;=lz?5AsjFj{-x?vL&B z63s~i`q`!9!1@$Sgzw)$?Q?aqGd$80GQp%(?z(oKHcHKIugoIMXZcNe$C^UDn3{V% zDHF^xh^ajE0?oUEu?l~C#W$q>2w^cttQnIlwu(jjSiw=zR4#EA<9dSZ7LpPvG@iA< z`as~3`-c}RG8yqIIhx1d0%kFD29v;2N@;m0M!H+Y*5(Vh<-?J#_A*@$F zs%AR5hEnLNU&`BBYpvH=tV~2?e&(3SVm_t#MWSW70<$U$9)T>N$sbNnO*|=?NuF1+ z(^6?*pGDKX-qX#Bd$z5NjUuO8q<6JykAK+A32vwvx}EMck9RH~%B@jPXa?%n_huq~ zXpubju=j1kJy)j1Z%DqYT7Y)%@%mm~q19rUa{qOqN5rfPZcLDMldRAkYE(fp(D=Yi za!Q_w9i!&!n>do%+R>x6bv6HIap{In0EV)hI5T=}fR)sf8uPhzW&{#9NplLR57VzC z-qLsnCJRE~+_OLXn9!1D5m((UYaA?fL8Y5&qE^We(J)Hi1_Ul%x2s3?YeE8%>zDIZRlgnv( z_vU0s0y(G!1P}@ksCb+Q0%W0T{Exi~^`E>?^^XkIj5a`{1x_mO-So_(fP;dwV?5OE z@;)Fz0R{r`#)j2yGA|GTZ#)gZwLzn30k*`fa#+kRcuuOdsXWp)VGTI~E9@G~5%3sT z_a*3!qi*4^(YNfqX1yS;v^IL``AlVwc?#pgPk8hygC)6Iu&i)dG$(&N(ebEPxK(=A zwd|)oxYn)bJ~V)wY_X^%DsTE8(+Ey@@agH+AnALCUU*|A-Vf3}2B{RW!=tdZGT_yD zH!v@sA7Xdhk)7^g+oI5^$JltdMDNNS{+ha3b!$3I!+Xd1A>g>Z~v3A*HjYD8d$ z&qu?hmzK=wsIPxkU{u#TSVNYs*cGR@)#&u=+-^Tt4 @WNt9}z_;wGr5flfPtGNo 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 NgQu&X%Q~loCIAI($h!al literal 0 HcmV?d00001 diff --git a/pygmt/tests/baseline/test_colorbar_using_paper_coordinates.png b/pygmt/tests/baseline/test_colorbar_using_paper_coordinates.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f8b99d40771b44be10e141ced560ab80728054 GIT binary patch literal 1183 zcmeAS@N?(olHy`uVBq!ia0vp^O+Y+{g9%95?0w=0q&N#aB8wRq^pruEv0|xx8BkER z#5JNMI6tkVJh3R1!9Bo7!963txTH9_D6^nM!BWr2DE{xNbqowF8lEnWAr*7p-nGxW z;vmuf&@f7oG5iFpg_ED7@#7}DatE)u!Aq8Z$Z z|JMGs6IJPxc)NT4@tdZeSGTP_cq?wr-iEiu=R$$t>JdZH%Nw=?H*~ho%8Zy+toPKw z$V1_9)12btj}4!C80o0)Z8Utg;YCo{irYMwm`hGfIR549i^Ue2o(jz@eqNOk+3xo9 zc6fe>{j%v-HQRmH)ymB+&4$k&Jxcn~dHVF}N8O&K<>lso9{l}V`*Z4(psl&qpJ#=) zJX4##!#wA?m*&TG+RlojU+j;oLBGsJdOG>UKpEdF5@N@pX z?TOL6WxqCk<0|T&KP65)=IFbl#(Ok(blp{MW&t|4nPpoBrw^2A)rIDm))V!Dl)69mqFIK4+_XP^47o!^*@X8&-sJGK4oM8`wdw~9}= z>B9DIjsA0=<%!uR6dHMifP`)o(`6`=M+oRi1746QR;eS#HaQQ&mFIO=u;ty>?f|Jt zOv={)`Z*clLP?c^r7A#YfL#P6axP-H5GZ<)r(Irk`bU%f*W(<@F7llE{-!p%n(?Nq zvBv$)+ZXeky1c;_;;D$1;&T$kHgdc7M`iaKmd2LL%dfh%ZSAUwv$x-$x#a%7eO>-( zDF-|E>(ynR+j)7heac$dUcs{;;w%okpX9msds(KM)EpCE;VB(yJA}>^XwOXilGwxP zwZZ&}q0RY-?7iRb&TnrHx?cLfQh07#_QT8_g0tD)*T!C7zW*EZ7uMTu|2Jf`Nk8Pd zo+R0HygW(u;Kb#@!s<(R?)iSOxaQG=UF+P9U6wx#tB_hZWtn2Fh+1E|)H5&nRzCxQ zd)3cnB)z!Tt=#qbQsll1Yn3Z}eqZr!dl*aH`NZG+9h|9N8TqWA_eH= zn>PQ1M1KY8O-@p)YdSO2(?*|N?H;qo#7|XOU2jt=z9}22JL~CRi(}}ydC6qWzq-RR zKEQNs`T6-pGXvhuXLfqLRdzNj){8p{j6Lnwe%UEAR4ZQFf3!aM@MSm8Qr4&c_PSn7 zn)e{-W#w^W-eT7GJ9_Ueykh?Ao~h(BseRk$)P4Bh!rlKykLCHyWtndL++2~_{_~Zb z6`m`zizX2n`gTTShz5Fy85}Sb4q9e0NZ;M761SM literal 0 HcmV?d00001 diff --git a/pygmt/tests/baseline/test_colorbar_using_paper_coordinates_horizontal.png b/pygmt/tests/baseline/test_colorbar_using_paper_coordinates_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..dced4c597bc90251ea57919f28f2dae7c33c6323 GIT binary patch literal 989 zcmeAS@N?(olHy`uVBq!ia0vp^e}Oobg9%7J^#1M&q&N#aB8wRq^pruEv0|xx8BkER z#5JNMI6tkVJh3R1!9Bo7!963txTH9_D6^nM!BWr2DE{xNbqoy5X`U{QAr*7p-t`T- zZ6I;%<8igODd&yUAIeSAzi|8HPIrE%h^=olH3P-9j(rs8oBW{T`+w=S&fd9&M*OFw zZ%*o#Sj>?9sN-zf<}V8wpKrgJlhpI{Qahtg!=1xQMf}|-Y;}~rZ|Jylc+u4x^6%cg z+jcuQ{i*)Z^i2J?OP^nR|MDpR8>5XCJ0|Y)ydS+^JSIj~@0*i+2?y8~}|>tC9G%~0>hx0nxmXKw#{{%^$w%Xsc!i+Jwca3_J>=l0uh^(rn!8#_BY zTU$@ByVfhu%bz%uw|)2i{nNjE_@I!vH}3wudtsrfD`&{%Ki%t}o+~-6wMNuc@uX$= z_0lNkxy%SJqWBj-=bmIfYmMg?aLC|SiQ-xmj$85jz2EPNufLR3Y;B>S?>po2qXRoW zJ-auzc}{U?XytqTik<^IO*{X~|F|LKRB-NWQC z-f4ZZDd}GuYprbU6IXz4iCsoKW>mU;LEflb5>h|MxO(zVYU#^D3jnclf36 zkSl(s8TX*7K-Ngd>XhwO?jDVmK?wq-e9*K64Kb~kyIUOH-`dvBGH9}57n`g2J;dvT z-_4yR#m~OZ2yr=a%l+2xbNjibzfrbc+Q&WBlD9HF!?Jnpgt`={HM+UOPJdhzy7 zpL?URu=5Akr4l9M^yZ{bGEY{>|Jc6r;=Q@d8~$4!NXb0mWdA+?^Zo0kclD#x_IPep_y@<4_c+O38g-XFuuHExhj`#I)1=K0GKryJYD@<);T3K0RSkG-KGEl literal 0 HcmV?d00001 diff --git a/pygmt/tests/test_colorbar.py b/pygmt/tests/test_colorbar.py new file mode 100644 index 00000000000..c78c39cbf02 --- /dev/null +++ b/pygmt/tests/test_colorbar.py @@ -0,0 +1,59 @@ +""" +Tests colorbar +""" +import pytest + +from .. import Figure + + +@pytest.mark.mpl_image_compare +def test_colorbar_using_paper_coordinates(): + """ + Create colorbar positioned at 0cm,0cm with length 1cm and width 0.5cm. + """ + fig = Figure() + fig.colorbar(cmap="rainbow", position="x0c/0c+w1c/0.5c") + return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_using_paper_coordinates_horizontal(): + """ + Create colorbar positioned at 0cm,0cm with length 2cm oriented horizontally. + """ + fig = Figure() + fig.colorbar(cmap="rainbow", position="x0c/0c+w2c+h") + return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_positioned_using_map_coordinates(): + """ + Create colorbar positioned at latitude,longitude 3,6 with length 2cm. + """ + fig = Figure() + fig.basemap(region=[2, 4, 6, 8], projection="t0/2c", frame=True) + fig.colorbar(cmap="rainbow", position="g3/6+w2c") + return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_positioned_using_justification_code(): + """ + Create colorbar positioned at Top Center inside the map frame with length 2cm. + """ + fig = Figure() + fig.basemap(region=[2, 4, 6, 8], projection="t0/2c", frame=True) + fig.colorbar(cmap="rainbow", position="jTC+w2c") + return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_positioned_using_normalized_coords(): + """ + Create colorbar positioned at normalized coordinates 0.75,0.25 with length 2cm. + """ + fig = Figure() + fig.basemap(region=[2, 4, 6, 8], projection="t0/2c", frame=True) + fig.colorbar(cmap="rainbow", position="n0.75/0.25+w2c") + return fig From 1e14c33ad859e76e6aae00be728b38d306e2bf35 Mon Sep 17 00:00:00 2001 From: Wei Ji Date: Mon, 7 Oct 2019 14:13:45 +1300 Subject: [PATCH 2/5] Alias box (F) for colorbar Including tests for controlling how the border around the color scalebar is styled. --- pygmt/base_plotting.py | 22 +++++- pygmt/tests/baseline/test_colorbar_box.png | Bin 0 -> 1520 bytes .../test_colorbar_box_with_clearance.png | Bin 0 -> 2093 bytes .../baseline/test_colorbar_box_with_fill.png | Bin 0 -> 1452 bytes ...st_colorbar_box_with_offset_background.png | Bin 0 -> 1313 bytes .../baseline/test_colorbar_box_with_pen.png | Bin 0 -> 1542 bytes ...test_colorbar_box_with_rounded_corners.png | Bin 0 -> 2114 bytes ...est_colorbar_box_with_secondary_border.png | Bin 0 -> 1610 bytes pygmt/tests/test_colorbar.py | 71 ++++++++++++++++++ 9 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 pygmt/tests/baseline/test_colorbar_box.png create mode 100644 pygmt/tests/baseline/test_colorbar_box_with_clearance.png create mode 100644 pygmt/tests/baseline/test_colorbar_box_with_fill.png create mode 100644 pygmt/tests/baseline/test_colorbar_box_with_offset_background.png create mode 100644 pygmt/tests/baseline/test_colorbar_box_with_pen.png create mode 100644 pygmt/tests/baseline/test_colorbar_box_with_rounded_corners.png create mode 100644 pygmt/tests/baseline/test_colorbar_box_with_secondary_border.png diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 4bbf0c7225b..d1148b31a54 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -126,7 +126,7 @@ def coast(self, **kwargs): lib.call_module("coast", build_arg_string(kwargs)) @fmt_docstring - @use_alias(R="region", J="projection", B="frame", C="cmap", D="position") + @use_alias(R="region", J="projection", B="frame", C="cmap", D="position", F="box") @kwargs_to_strings() def colorbar(self, **kwargs): """ @@ -162,6 +162,26 @@ def colorbar(self, **kwargs): corner (BL), but this can be changed by appending +j followed by a 2-char justification code justify. + box (F) : bool or str + ``[+cclearances][+gfill][+i[[gap/]pen]][+p[pen]][+r[radius]][+s[[dx/dy/] + [shade]]]``. + If set to True, draws a rectangular border around the color scale. + Alternatively, specify a different pen with +ppen. + Add +gfill to fill the scale panel [no fill]. + Append +cclearance where clearance is either gap, xgap/ygap, or + lgap/rgap/bgap/tgap where these items are uniform, separate in x- and + y-direction, or individual side spacings between scale and border. + Append +i to draw a secondary, inner border as well. We use a uniform gap + between borders of 2p and the MAP_DEFAULTS_PEN unless other values are + specified. + Append +r to draw rounded rectangular borders instead, with a 6p corner + radius. You can override this radius by appending another value. + Finally, append +s to draw an offset background shaded region. Here, dx/dy + indicates the shift relative to the foreground frame [4p/-4p] and shade sets + the fill style to use for shading [gray50]. + + + {aliases} """ kwargs = self._preprocess(**kwargs) diff --git a/pygmt/tests/baseline/test_colorbar_box.png b/pygmt/tests/baseline/test_colorbar_box.png new file mode 100644 index 0000000000000000000000000000000000000000..895ac1031f73bd09691884fb83ac213c252d3b59 GIT binary patch literal 1520 zcmZ8h2~<*P6vibNvLMZ{%`h96G+$N@S?*~{iw2EpxzM7eW2A-#)Kkk`KuVl3$3{gB zL(@tc&2I=}L z|IT{~PCJ`(Guscj1xIZ79QT__BtwSv`Jt2<6p%&+vZ8`g5*6SU9(at5Hb$;6!KC}T zg`6K+q>@Ud%%D}ti3Jkvmf0uWDS#_`vN3pCEEa?7)%}k7k*t*OCuC1@uVE^jL@-2f z&nx!GGhpFHC?#zl_cI3+>p33qIzJ6uJ{~TDUM~+9c0*~CN%|Zfy3pRib-GY4V}8L_ zk{=j$qkfyNoNvIY=n64lS<9DfqVsbYB(OM7XzJeNj!qfy6R6Cl-hZ-rICfL1I~Xwq zzdAsLEoW*Umf7pD35d(bDK2aRk{u~7pptN9&Q48|d`&N+7I_l%ruF+THU|Fsaxa%* z0&$S1OQ&;3IM#A2scewgV#wAcb&e5=xhP~}YA11lg$yc7IAJ5k9d^IJ6BPSKi!73} zQ&n7n^&U$!Z0FV&xDev-JG0tk)5UAzx6OdDYo2rbZ35X4Td>c9ch-l(cg# z(#oTotCx4=ADn{i0>BIMwsDi8nGa znebD%B(p#1qixrNdoU)m9US9!G+}My{CBpl0NZ3$jli>@y|kfPJXIP#&Jodfpfzak zo<5p-#%WFXC60;vu->mmqo=l3OsHrs=3@G4IMhD5wNExa^<6pt595-yFnxi@ERv$7 z`Qkz&;o~W6>srO`yn*TG#vE-p=GdnL^5%4|s&46vK^otMsTi(%Wh{@`$R4f@`2h5k z(XCjN!U^+c1#qgnDqW?$t4eL6zt$?A?&6lI(!P4BV^n;;(^fzfCDD&&_44c_5e=ZE zi7K_8bn9!BreXbWxdaGDv$sFezuJYf?07k@uDy7=Z#+9QVwDF-%*cIQK7+lBRi>|X zi2<1zWn*@;q`9*Dx8ME0k$pM#c_<~p2*qhvGs3=gw-4@tD_!foGRTccw?+|t{JpEa H4yOJC7NO(X literal 0 HcmV?d00001 diff --git a/pygmt/tests/baseline/test_colorbar_box_with_clearance.png b/pygmt/tests/baseline/test_colorbar_box_with_clearance.png new file mode 100644 index 0000000000000000000000000000000000000000..1511a8d72312239a6d486750538a740701ac4a64 GIT binary patch literal 2093 zcmc&#dr*^C7LV>Iu7b2~nV=Fw*G-zRNJ>Jb5eo#tK%j^zE5#V1=HUy2Bw4~E4_kL| z7b(~z79$U#q2OX6E2wN59^E31A0~@TTwWm&NC>3?0!APZ9{VNJ+1dWH|Ln}}H*@DZ zbMCq4{_gMo?m2%-NhbPi-?JS8f%qiE$C4qCO-H~1*|r(<)Ky-SfWKc}iBIQ3AR+tR zV^i)|Q8}O!#*6!y_fZy$$3MeiLWn6zfyDD!TppLsxp0LSh!4SHX=@El5Qx{~gjhmq zZpDm|P_kF!cl8YU&CS12eRuvAm0caj?$cd!26A^~4GN1GHPqSD@xxoUz40vPYgV# z`=NFR<+`3c;&=V1)a%kVpR&SVe%)c%M=fYz1h&|tnnX?kPdBwEC%%_CGrA@RCU`z>Ho)_Y z3SXuB`ug6D60_Tj%7$lh8q2;taNB+K8x&eM4c`_4a@Te&WOf9Kt7;v}%n%}iNkDg{ z>+IHU)biJSyQ$Ko-nagOaR9nJXa3QFX@nB?lOkIt)`CJzPYdKjRtBN zj%(PmX`V3@;l&IYV&!P9UMh1OiL?_dO#rN#RhcttP`Qsj{NTw3z3#Qpw&k#SvVTYQ z+XxLKWC&wfOaek_Cq3|bWdU@gR4Sok%QBHmpr3?%#}hU6%{fv@w&q5~e-{9pYL<`S zz>FRI%bxr!EFO(N3Rr3_x7}R0x1^nri;Mbk`jxLN_q4t>&c4&LUq}?#s6ULKL+}%U z+n2vWvgd}bn|<;BxNSwse-)`G&h?NqBoXAzLB$M&$42oN^bgf_p5)&hP0mN12-8bm$!z8t)@r(Jsz5&!}Vi$>$) zf!bPd>R%UrP#RHZ3FNoM|K|XN6cogW8i_!7$$!dF4!}Ng3rlAKxA3I>_cWkVJTe27 zgHzE-J3*m=@^QeFGz#Wwjx4}&{mG-%+6ize((x;lD7|rApYQYVOE>@G<8FOQRTeS$ z(0tqhxU?B&@3bh%Di=VHT@27Y z`DC8|)(<*kUm1@PfwbFo7u3comf(EVWL{OPq4Bm-nzJPBImH>)FR)rvtGCW}lt}0! z^F@br9RI=#cNRAUhnm96b?jEPai!s@%9SSv-qwe~PUH{HnVjP5n7x|$ADDt$Zh=-@ z!L%A?#^AjR_z(4Gw2s4eWpGDF%&u9{MN-GeRJ6$2U9Pjvb(;6@AAyOr{`3I!YXmm?k`QVa6l8k>Nlxs|DE zv6oCxxuf1TMq$Qa?V_Xd#EvEX!kY=#QTXp+7*4b6oX|N3mIK-en?Y$YQ90&2(0qOV zrWck>0i6`W7W%HoXJo8w*n58zvY6I;r%^i2=^dh&#uB77al#V;0d zou|ZMH(`wmnfBAV3x|rAfystsJumDNAIoo@kCD#~t@zpUss?NexbQA-iwz}berEow zkzM-zw2CrRUwYLXlROa2hC9--h*_)~Zt^1-Z literal 0 HcmV?d00001 diff --git a/pygmt/tests/baseline/test_colorbar_box_with_fill.png b/pygmt/tests/baseline/test_colorbar_box_with_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..3c52057604ca4ec3f7f9d26a27496b14f52b8931 GIT binary patch literal 1452 zcmaJ>dpMM76#pWl-{&nHV&ajLW#BO>fngIYd7AjFosBnr$oj9g@F!N*##Jqa`as)u| zBW)v4Vi-(D_+@G=a~s~~;K9(v$29<;X-9N(IhAmK^1e&Cc)Ii?zf&e9J2I@Ss)WMcwa@Xh)hA%fb$l?Nm?kbj3xT23ezKi3j zi@jvKvW8Ku*LaTOw`BDX0Alpuv^waO24Oq)s=-#ybr?$ie>rQeL-aDe&Ez$o|De=d z?@Da?hQL@4PM>!&LlK@IMUs26qbW8%TCLEGa!>(~qilXR#l$!>0=4Qx6W7546gI80 z=Er5c1`^3p)BwO0-f1Saoxy6qX{XY60PL=0#F z#Cyoj0iv$&9O!w;@KNE)wk8u{ZrJ0#2?y zz8~wMI?WqdyAtee-&_qzw+zKgcOd5Fs^>uwyzMPN_nw>HEpL!&o^t!(IROjFVsq)N z8?A=b*J2MUhJ&XSXrDT*@SXu>9u7@Pz=V%ZY>@6v4@b&bw^T|Gwpy)zFxZwlFr-o$ z5O%esBi$rexT4UBSS=|VEy+3#UY_6XZ>kYHTh7#6Z&>wwB--Rt4K_>Gp8wJ~ePwhO zXq8lLlu1})6$%BAz|>wfHkuEBUQOlJYSjFuCumPA1foNxViv-#ko<4Z;8o1LUws;! zC0&SUsrqbPs!L@yCdI%c*XwGWm;$&RDbxio#!?10w*+=byqQAtfxN9RCZ@YO($62nnwc`mpJAT@q z5mB0Y=P*wlCl?YK6}&cjKq{SCE0HDc(NSoi<7?yOql0+HZaGYaE%6Jhu z+_Dd+oyzlnbp{->g?8SMgu>TO-Rmjq{4=`jmc?>-?x?n=IbuYqc>eNAtrib#b?UVD zpQ9BQ2~(2~*Ojn6&UqhWr$$H?{p+)6V_c>DWYP??!}Dm~)a=j0VVE{=Lxt+QSGjy} zP=^^EA-zK3i@LnbNgQ(bnYf>2s?6Gi6zVk4O9}+^P>XvD5Anv;M+Cptzp1LhC2a&F zFQi7lbB*z7e58XYDSuD8rVoU6;v_%lBFf;9$%10?)!Xme`es7vEhjYiTgmIH_;ZPT zL1&Ar>~!ufj(qH`SwYE`d6q--Qb@f8o+ITkWTdD#<<}{(h@|Yf1Dcdgzu6G=WhdK) oeaO8I0HY26e@U%wu8d_hZ2Ez2yzWf`x@iHTyN_GVv9OGP0L_G@YXATM literal 0 HcmV?d00001 diff --git a/pygmt/tests/baseline/test_colorbar_box_with_offset_background.png b/pygmt/tests/baseline/test_colorbar_box_with_offset_background.png new file mode 100644 index 0000000000000000000000000000000000000000..273540f0c7950d787c2390da8b76ee18e2f87054 GIT binary patch literal 1313 zcmb_cdoY_>6pvSn4Q6(>qh1?oFgv^6nJKo}k5)I-BUCe<*~D|CVZEYMLRw>4RYK#D zTCW+E&ZK15tYz#X#SXEiiD#pXYS2W`#v&wq$+sW6vw!W({;_|Y-@SA0J?H%HdED}_ zP^^iur7;45FbNFszX`8gSe_f|!e~Xyki&~nW+Ry}y5jVHPB(W((5?8b_iiWyDdL zOjc6S|Gk{w5Pp2cCc?E1{W2yoSS!Koj!*ZdZ#r}iPY^BD9a+1~b}qL9YEe7h1G7qA zzn-Auo}Zr75ErMBLk_=CEQUH70S+<7`%5U7w$0^wKrPz@cg@TnkF`@)u7|45gjyC+ zZ9Np@2F*4&H)J)x$8KJzy~JKATF$l*d((pki*J_Tv=%rZ!H(aPsTEoAbj#f|GXmF2 z@C3SA(VP=1H7C%mWR2~wL`u!u9(~Zo0_0$R4@tZ7Hcszh8!5?!gZG7>3j%#{1|P>C zoteS5r}xmiLH2wY61SWx0(6t!P$UPbT2QwMR zD`od&qh4De7ya&cV%Iy{g<2*3C;w@hCvZLluFg%6XxyaXK6*smUmxS^1@x(m|IGtT z^Nx0g{SU*JxW5^~X<0Z5{74Gz=S?QZ$s*x0+p_@~jV?eiMG*SXL1xYRKC<*c0MUvzZz)d zZSe|{OtFYqz8A>SgyHcavnoCgha`xTn_J~Xp%}yPLMrBS31VexEUC)|lSW%-lJ@DS z2aD(zJBFD;Wnt@qwXZfd1j~>PfX~;NWQjFX2pQD?-96(va0!ROI`6dpD&6h(o^j)-9v3sal(*R1{OW?#?Wh#& zR@JwwP2cJ5_K%f-(<=Knd_W?R%RejYKNO%?{F>ucrg{gb{}`#UP_ONs_uIsOF#>n+ hhZ#8?l>ZSldWcQpvLR9s27hme!0Vy@ysM<*zW{4|u)6>N literal 0 HcmV?d00001 diff --git a/pygmt/tests/baseline/test_colorbar_box_with_pen.png b/pygmt/tests/baseline/test_colorbar_box_with_pen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca2b1855c50691dff182be0cbd4ec31f524ee29 GIT binary patch literal 1542 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 literal 0 HcmV?d00001 diff --git a/pygmt/tests/baseline/test_colorbar_box_with_secondary_border.png b/pygmt/tests/baseline/test_colorbar_box_with_secondary_border.png new file mode 100644 index 0000000000000000000000000000000000000000..7e88ab113b4e244e04d9e02a234a19442b111de9 GIT binary patch literal 1610 zcmXw4dpJ~S7(Z^0OXWJbErp#a&WX6_kGN?6O zY%WQgMJBPBGl~t#q=d;)gv>mHnGu6MGwuHIo$vhK^L_98`@Qe?y(b?Xa(IiDsTKeL zTLS$3Fz{Rjk4_C`_=!1W!G|YJg8xY(0NCx64<&Nt!3(g_oP;_-3d5fvrN$)30*BGT zR)^2xi6kN}Ii5hWI$-DIgk7t72morY1N^*?k#El53cWJvhv4?A_$XiTiUapN{$LpH z>5p&mO;Tdiuz>_aqLN)Elz6T1^!F;xI736*-t@5xMaMJPZNlcVrqP-EvIUQJPIzgO z?1k=rZOM@teSZ_A1%j@g19{&jquUTy%o8O}{(*hxslodAg0I`}+2(xwIGsc-sFSby zR2s42=fI8ILqiU3oBScAnEVQS6ggTgAl9R1mmu`@`C^?DH(E_u5 zL@cyB^1oN!#LYSO!#SGUUOJkR!eLG}VCeOmrkgwy!n0rs%XC8Dr?vm4exHh!{+J5WbuT7_ud~w4R!M%OACuP>RnRP#(N!WNl-;4qe`bT zfdb~cV6WS;0s&5TU;Q?u$6o$t_h5Y{S<_mcGc_;wsAsB~Wb5dxE^}nCA`_Y9rc0WD zD7aNM&kfC7W;z;mwX_oYZ>U!`x+K*L%XHK387gv!W@@T>mF$8 zdBctsGGf$U$=l%y@vC7AldNZLaa{sBi*_J%0#~7Tv#9-}zjSi42ixGFu-|wr%s@jP ziHwGKau{$5=NWOeM(_s%`@!{Nu*pGDB!%@An>*Z^YqG|uLH%XO8E!3}^1!tp3ZlG> ziuc6GOjSi0#dfSix}4*!?X_lbSvv{c)InufmbY<9 z09e~Dfa5IEHxqcpC{8TEY2XC`m*b#a@G%Y%v*3jaq*w)$`=(lf0GOU8T#wUFR!^}r zZC>eZq=2CU^_r3aJ?x@qStwT)#?IA>$I9I3C14x@Y(3#y_FNKHHF| zc@pqAlPp}5bx)IWb*BWlg4cS*rbthhxhL&}WWIFqx2^R{^NjjBp0Hq*M(m4p(|HzQ zVkSs#I4Ce+3?!taS+`vo+<%%Uj)7tW-nmk!^dit3;7><2EXow7|g z&J}l99;qq!moAoHjAGMFTOws&DbbcP5b3f*RZ_4t^T9}V2DOHvI`6ycsX49&UjJMOc1((@j$QTaa=0w?`y2K%LvptdJh1M7&|xNM#XphB7$Z2Q}VF*;D}$orS!#JFVo!2aRuwAY#MiFH@MW z3B#Y~X)uWPZQl3^tc*lpGf~YMF}~mq0sZ|nvJKcyYe_r5lcW)I4L?>~%1WK4H=MAw z#C>54a#})N1i4Vq#LdNVdmq_oVf%Ra#e<1rkU5Iio*hq1nahQGo#rWq;;4kW#>xHG zE2d^mD+|F<6V4k)6&LthYeZUHw-u@5+Ile>FM8j+Z)tEe!X=I3{bpl>D1YJ;tx_L# zjocu|*^IA*B;~;u9ih|XT(^E)BIRD=RMfs5MHO`_I@JH&uqPw`<%5TZsNik*KL7-v LLi`^3oX+|elnfL| literal 0 HcmV?d00001 diff --git a/pygmt/tests/test_colorbar.py b/pygmt/tests/test_colorbar.py index c78c39cbf02..2b019c4b42f 100644 --- a/pygmt/tests/test_colorbar.py +++ b/pygmt/tests/test_colorbar.py @@ -57,3 +57,74 @@ def test_colorbar_positioned_using_normalized_coords(): fig.basemap(region=[2, 4, 6, 8], projection="t0/2c", frame=True) fig.colorbar(cmap="rainbow", position="n0.75/0.25+w2c") return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_box(): + """ + Create colorbar with box around it. + """ + fig = Figure() + fig.colorbar(cmap="rainbow", box=True, position="x0c/0c+w1c/0.5c") + return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_box_with_pen(): + """ + Create colorbar with box that has a different colored pen. + """ + fig = Figure() + fig.colorbar(cmap="rainbow", box="+porange", position="x0c/0c+w1c/0.5c") + return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_box_with_fill(): + """ + Create colorbar with box that has a different colored fill. + """ + fig = Figure() + fig.colorbar(cmap="rainbow", box="+gorange", position="x0c/0c+w1c/0.5c") + return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_box_with_clearance(): + """ + Create colorbar with box that has an x-clearance of 0.8cm and y-clearance of 0.4cm. + """ + fig = Figure() + fig.colorbar(cmap="rainbow", box="+c0.8c/0.4c+porange", position="x0c/0c+w1c/0.5c") + return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_box_with_secondary_border(): + """ + Create colorbar with box that has a secondary, inner border in addition to the main + primary, outer border. + """ + fig = Figure() + fig.colorbar(cmap="rainbow", box="+porange+imagenta", position="x0c/0c+w1c/0.5c") + return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_box_with_rounded_corners(): + """ + Create colorbar with box that has rounded corners. + """ + fig = Figure() + fig.colorbar(cmap="rainbow", box="+porange+r", position="x0c/0c+w1c/0.5c") + return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_box_with_offset_background(): + """ + Create colorbar with box and an offset background shaded region. + """ + fig = Figure() + fig.colorbar(cmap="rainbow", box="+s5p/-5p", position="x0c/0c+w1c/0.5c") + return fig From cbca922bcc2440cb9506c7de24a0cec3b672a527 Mon Sep 17 00:00:00 2001 From: Wei Ji Date: Mon, 7 Oct 2019 14:48:36 +1300 Subject: [PATCH 3/5] Alias truncate (G) for colorbar Included one test for checking the truncation works to a min/max range. Also made sure region (R) is parsed as a slash separated sequence string. --- pygmt/base_plotting.py | 12 ++++++++++-- .../test_colorbar_truncated_to_zlow_zhigh.png | Bin 0 -> 2540 bytes pygmt/tests/test_colorbar.py | 10 ++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 pygmt/tests/baseline/test_colorbar_truncated_to_zlow_zhigh.png diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index d1148b31a54..974f57890b9 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -126,8 +126,16 @@ def coast(self, **kwargs): lib.call_module("coast", build_arg_string(kwargs)) @fmt_docstring - @use_alias(R="region", J="projection", B="frame", C="cmap", D="position", F="box") - @kwargs_to_strings() + @use_alias( + R="region", + J="projection", + B="frame", + C="cmap", + D="position", + F="box", + G="truncate", + ) + @kwargs_to_strings(R="sequence", G="sequence") def colorbar(self, **kwargs): """ Plot a gray or color scale-bar on maps. diff --git a/pygmt/tests/baseline/test_colorbar_truncated_to_zlow_zhigh.png b/pygmt/tests/baseline/test_colorbar_truncated_to_zlow_zhigh.png new file mode 100644 index 0000000000000000000000000000000000000000..1a8f80a90c86ce8450b2673afb339f5b6ae340b2 GIT binary patch literal 2540 zcmc&$X;2eL8Vxf^PA{~VJqc#pWvX;km@4Ue+f zyFFiEq9K4IA&MNh`CCop%UoNx@VjmwPvDML%Z+JS?>KOCOk6naUydL2SrDXo6Q@2f zA_WOURxEe|W*4oF-;DNX)JpQ5YQBfHQ^=F|R02oQ8kA0-FHZJQ3@2X2qz5B!A;JmOe8Jtt2V8OkK* zELIhamM8J_P^SiSCrA9a8Y8cwFxe3}rN^(;kB(<7KL^>nEn{k-GRB)3Jm(upzn@#) zvTyg``TO-cG+6IL`Q?Hord43B{<=L6>8^fqoE4@a7-K$9{eeH;Qlp2$K*uVt1@?VB zc-52;Iq=4YuS|9{FlogwbWrXQ`t0f=xxVnio@>?0G8sMv%~Er`qQ|u-U*B4!Y~b`kkT|y#?`gOmz0SGUhhpE z7QZX|fcOCAnkY_$Jm-@VYv=Eg6{aCVD-Yk6ski|2^RH$m5D9wakh0cO)W9)ta7NUQ}?4s zeYy*c?>b+$;W%=x$hD51|J295v1(ccOKu7@SlA1)D!?nOjn>87!AMt+*Q@g~J}B#F zU4|K;c=FCtctAAJ2nCH&6|^76BJ_E?VrL93s6TZ;o|#ZTsv2_+G$B!$w;MW=vcB0Hh5*H`ds(Nhb@!FMi#NDme7QfBE#=0 z-W?7vZX*j=gedubV0czofLJfR#PNcedwMye|4#6atGqWpqUJ_Cm>yeKqks(zBF7J1 zogP%(2NFLyW$e|`()W-*w9>kny%`iEV#{Bjx59LcAGF2nrg%a@uO($_=4Ad)`VL?S;AN3Mk8J7w5@BuAPp#MxO30euLxx6 zSa%SlsbA4;xu+79uKfkYG=lWs2_>|Lgn!_KfWHw+XkS0I`7b!{Q`buHE#Vq6qOcV} zt==vY$Fpf&Fe~L_uM5|z*$ss73eFlgr2b9Szhj6q{(~fmu!ZgaS`~cfH%Ss<#j#1> zRQ=C3{)ux+;_pA(c%yGnA+f@me^hm-$pd$(&z8AT776m&WvEe zZ*DEsjh)Zq#zJUe9$D>vS?HYd5A|;kr%oJp<|ISP1Jb-1k(3d5Lh+^Ck6M>fp3GMY zPf+0DE_Ks$XD$}0rkM7;+>7`XlZdm@njAo;Ej3*UUfwyJ(W2%zlQEc44`tqhlRy-Q zpB8yM@4;)Hj8XeUihZg#Sj+@&d3v0sqZ%4yb8%0PUUkuqCNdE0Cgx{SEM-aH zci9&iUzl6&pkO?5`52S-JQc!+@nHAF?MG5eu2#;@TyNhx;PGiPXre*T^eWd&JMNy< z1?Vl|&4}6RaPt&kGf8(S-fiQ=H0Ldk)m|Am zw>hgy5xBYunKdL@qZ0fiB2wTLnvg2eiI$kQC|X``6DIl2O{mEY^m?8bmM+7E(%BxT zveEOZKsc}6bs)g05689fz#5oUF)V3p{?W!OPZi%1GF4~j=9BLl4}Skb%ZpmHXSs_) zVxenj-!<19?3Cu2HLh{|yK4MO<-3(Z46?q(hP zEDRl;E?u2EqOp3Hw0dvSXzSTf(-g$J(fS+;ERq^J1}>D6Nsf1qBSr(e;)5`1buIaG z3Z$U7BmHmgyjL^cWJZ75` Date: Thu, 10 Oct 2019 23:43:56 +1300 Subject: [PATCH 4/5] Alias scale (W) for colorbar Include one test for 0.1x scale. Also added docs for truncate (G) that was missing in the last commit. --- pygmt/base_plotting.py | 9 +++++++++ .../baseline/test_colorbar_scaled_z_values.png | Bin 0 -> 1868 bytes pygmt/tests/test_colorbar.py | 10 ++++++++++ 3 files changed, 19 insertions(+) create mode 100644 pygmt/tests/baseline/test_colorbar_scaled_z_values.png diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 974f57890b9..a1db9c60eca 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -134,6 +134,7 @@ def coast(self, **kwargs): D="position", F="box", G="truncate", + W="scale", ) @kwargs_to_strings(R="sequence", G="sequence") def colorbar(self, **kwargs): @@ -188,7 +189,15 @@ def colorbar(self, **kwargs): indicates the shift relative to the foreground frame [4p/-4p] and shade sets the fill style to use for shading [gray50]. + truncate (G) : list or str + ``zlo/zhi`` + Truncate the incoming CPT so that the lowest and highest z-levels are to zlo + and zhi. If one of these equal NaN then we leave that end of the CPT alone. + The truncation takes place before the plotting. + scale (W) : float + Multiply all z-values in the CPT by the provided scale. By default the CPT + is used as is. {aliases} """ diff --git a/pygmt/tests/baseline/test_colorbar_scaled_z_values.png b/pygmt/tests/baseline/test_colorbar_scaled_z_values.png new file mode 100644 index 0000000000000000000000000000000000000000..7fc3170c818299bb3819be7ac8400bd6dfd6fde5 GIT binary patch literal 1868 zcmb`Idpy&77{`BOF@=6w&L+}UnNwkrxwIW@=|x9wM=rUOtjQw7IH5HQg>>Rfq39|k zN-ky5gmP)Ua+!rO_g0Be8)xav>Cf{==e%D1@qM26^L+kzzOV1|eZJo_E>3o8t2e9$ z06=Y@z3p#ue+K{{>tG6Uni(&#k~@`1`-3z9Fxs-RAaOUXW97+>(R;n3-6BGx=|NG4 z0XvudD7zyOv}oF)C`x2B%F@WhB;ZTwT>wz(-DgWY5LYlQ{3YtWE%Nlpb)Onfn>T*o zB?ha2#V+*%w%$oiTjkPgcp*P~5U_jS#1jCGn=j7gl;R8}w|&allZow+nixv&n>Pu& z?!Tv`1cAo}Qp@S0%KjSaKutVtsmIbY$=nIQv-TBZFvED)+B)M_Z=Y~-u(~Pwd7C%B zkWpn~iJa-|3}vB;FFp-0QDzlApeQ2`@rECJt<#f`Lmf!xQ>)FQrO!Bu@O}fK`>8F^ z_~ydcA$EK!(-^aGBV;l_gQ>dtXdt)s4+oa0n_ zDWL`aA(V?QFu?1~sXXh3=hCe?)zmSf_Vkacy$PZf|H#9gk-is$lZkJxjq8I3= zbX*Cf`{hbIWdOP3IH^(^xHUxt#094*;)vtDZu?(BVdmV~gKfe(r}=066OjfZ$7fw4 zv7bAURT2bj1RO*Rre7COHozcAWle!>_aSL7H?d_C?qgDhcD%TxluLw%Kk0aZsYPYr zp6>MJdd)N~HB-Wodyz2R?aQ~bXvYeY(`&a`OmXHL zQZ|5ybd$G_jwP@qiNmIuec;$MIjm?W>Ad4W4c~iaT-|T&&erf{ygr#=+$qjcJUT6_ zE?O8iYuk}N}4UrGn*);J#GMb1eCcXk%Mv8{?cG~v;c7h&X|H0 zsh~)Ju{tUbxTYdEo1x&?HoK@P)x%xjwr|t4AN}zjpQL{^8*DM8VTc;!%`Xa$8}mG;4H@8JQ)L^ zf&X*5|G6LkH1A*C%2Oe}n2EL7H=(I22Zk+duKzF`g(Wc(&nb@Yg)=aKBcP#>b{u#G z1szumnt@dQM&A)CuhdZWJ|&)9>OpQPdH1Nhugv?AR?1aMp4dEzU)k?;Ysmu<8;1;g zJyJt`sT|mjtny#aHr%Mn#cHOC^1b(n3aa=#os?ZisY5z94CMJ|XZOs;l%wmU_9^2p zi0xgQNCQGonQO6F1J|k=ai_ZYbpk)ePtQR)U(|OtUsSe~_r%gXDJ0XF_fQ-<)TvJO zh!Y3GtlV{&*mrAANx+xyGinbnx!4EnwoqRgu1p#a-xg~2xm4g?zu3jaNFR@4q@4Sh zG;2gIwefS8e27rXzJ!mw=Q+iz4zfda!k?U2ciuvyD|eEtT*67kjjd@6cIbv)+H2LD zRq|m42htz%>)&>9!Gwz5lY-N~LifzN=C{xq`9CizIHZ1UUmP;1|G-{$6Tavm2v?pZ zjct*+b`#7B^+^1=ZYXZhxzf!P60Og>nr{cc(J$_3GA5nxb_y_BrvNfnhg-WSZJpQU z|GC`uyS$k8>@mIV@oSnUZX(Da*}srHoHTt?g{U<2C5Yd@IQ>k!xRdGY0A~_Lv&!g3 z4JQPv4IE)}X@mzuXYjO6&etFrdkq@{ea$%`xJB1|*<+Ic>&ms_Icu2r#R#SM{e~ru z-5G1M=&mo3+3!43dTv%Y6PTkXlSRU*WKSG%w2OtR63?7+ZXsxK%%I!kmE3&^x~&(R e5v(1CU#x|$A&rM&10?xR2<+SIWP6ts$ow0UT_~pj literal 0 HcmV?d00001 diff --git a/pygmt/tests/test_colorbar.py b/pygmt/tests/test_colorbar.py index 26e71cf55d8..35eceaf5571 100644 --- a/pygmt/tests/test_colorbar.py +++ b/pygmt/tests/test_colorbar.py @@ -138,3 +138,13 @@ def test_colorbar_truncated_to_zlow_zhigh(): fig = Figure() fig.colorbar(cmap="rainbow", truncate=[0.15, 0.85], position="x0c/0c+w2c/0.5c") return fig + + +@pytest.mark.mpl_image_compare +def test_colorbar_scaled_z_values(): + """ + Create colorbar with z-values scaled to 0.1x of the original CPT. + """ + fig = Figure() + fig.colorbar(cmap="rainbow", scale=0.1, position="x0c/0c+w2c/0.5c") + return fig From 04559901785739f4a79613e2adcf3a63273ab06f Mon Sep 17 00:00:00 2001 From: Wei Ji Date: Sat, 26 Oct 2019 11:58:05 +1300 Subject: [PATCH 5/5] Gallery example for colorbar Created a gallery example for `colorbar` illustrating some scientific colourmaps and ways of positioning the colorbar inside the map frame. Changed title of this gallery section to be a more generic "Plotting map items". Also corrected lat/lon to lon/lat in the docstring of one of the tests. --- examples/gallery/plot/README.txt | 4 +-- examples/gallery/plot/colorbar.py | 52 +++++++++++++++++++++++++++++++ pygmt/tests/test_colorbar.py | 2 +- 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 examples/gallery/plot/colorbar.py diff --git a/examples/gallery/plot/README.txt b/examples/gallery/plot/README.txt index d8f769a3ced..c213e06feea 100644 --- a/examples/gallery/plot/README.txt +++ b/examples/gallery/plot/README.txt @@ -1,2 +1,2 @@ -Lines, points, and scatters ---------------------------- +Plotting map items +------------------ diff --git a/examples/gallery/plot/colorbar.py b/examples/gallery/plot/colorbar.py new file mode 100644 index 00000000000..195198cfdac --- /dev/null +++ b/examples/gallery/plot/colorbar.py @@ -0,0 +1,52 @@ +""" +Colorbar +-------- + +The :meth:`pygmt.Figure.colorbar` method creates a color scalebar. We must specify the +colormap via the ``cmap`` argument, and set the placement via the ``position`` argument. +The full list of color paletted tables can be found at :gmt-docs:`cookbook/cpts.html`. +You can set the `position` of the colorbar using the following options: + +- j/J: justified inside/outside the mapframe using any 2 character combination of + vertical (**T** op, **M** iddle, **B** ottom) and horizontal (**L** eft, **C** enter, + **R** ight) alignment codes, e.g. `position="jTR"` for top right. +- g: using map coordinates, e.g. `position="g170/-45"` for longitude 170E, latitude 45S. +- x: using paper coordinates, e.g. `position="x5c/7c"` for 5cm,7cm from anchor point. +- n: using normalized (0-1) coordinates, e.g. `position="n0.4/0.8"`. + +Note that the anchor point defaults to the bottom left (BL). Append +h to ``position`` +to get a horizontal colorbar instead of a vertical one. For more advanced styling +options, see the full option list at :gmt-docs:`colorbar.html`. +""" +import pygmt + +fig = pygmt.Figure() +fig.basemap(region=[0, 3, 6, 9], projection="t0/3c", frame=True) + +# Create a colorbar suitable for surface topography- oleron + +fig.colorbar( + cmap="oleron", + position="jTC+w6c/1c+h", # justified inside map frame (j) at Top Center (TC) + box=True, + frame=["+Loleron", "xaf", "y+lm"], + scale=10, +) +# Create a colorbar designed for seismic tomography- roma +fig.colorbar( + cmap="roma", + position="x1.2c/4.75c+w6c/1c+h", # plot using paper coordinates (x) at 1.2cm,4.75cm + box=True, + frame=["+Lroma", "xaf", "y+lm/s"], + scale=10, +) +# Create a colorbar showing the scientific rainbow - batlow +fig.colorbar( + cmap="batlow", + position="g0.45/6.6+w6c/1c+h", # plot using map coordinates (g) at lon/lat 0.45/6.6 + box=True, + frame=["+Lbatlow", "xaf", r"y+l\260C"], + scale=10, +) + +fig.show() diff --git a/pygmt/tests/test_colorbar.py b/pygmt/tests/test_colorbar.py index 35eceaf5571..5fea02100db 100644 --- a/pygmt/tests/test_colorbar.py +++ b/pygmt/tests/test_colorbar.py @@ -29,7 +29,7 @@ def test_colorbar_using_paper_coordinates_horizontal(): @pytest.mark.mpl_image_compare def test_colorbar_positioned_using_map_coordinates(): """ - Create colorbar positioned at latitude,longitude 3,6 with length 2cm. + Create colorbar positioned at longitude,latitude 3,6 with length 2cm. """ fig = Figure() fig.basemap(region=[2, 4, 6, 8], projection="t0/2c", frame=True)