From d7de1bc33d95a47f74cafdb0d8cfe39f5e51228a Mon Sep 17 00:00:00 2001 From: Matthijs Berends Date: Sat, 14 Dec 2024 19:41:15 +0100 Subject: [PATCH] (v2.1.1.9118) move ggplot2 plotting functions to general 'plotting' man page --- .github/workflows/website.yaml | 2 +- DESCRIPTION | 4 +- NEWS.md | 2 +- PythonPackage/AMR/AMR.egg-info/PKG-INFO | 4 +- PythonPackage/AMR/AMR/__init__.py | 4 +- PythonPackage/AMR/AMR/functions.py | 12 +- .../AMR/dist/AMR-2.1.1.9117-py3-none-any.whl | Bin 9962 -> 0 bytes .../AMR/dist/AMR-2.1.1.9118-py3-none-any.whl | Bin 0 -> 9960 bytes PythonPackage/AMR/dist/amr-2.1.1.9117.tar.gz | Bin 9721 -> 0 bytes PythonPackage/AMR/dist/amr-2.1.1.9118.tar.gz | Bin 0 -> 9724 bytes PythonPackage/AMR/setup.py | 4 +- R/ggplot_sir.R | 201 +----------------- R/plotting.R | 201 +++++++++++++++++- data-raw/_generate_python_wrapper.sh | 2 +- ....txt => gpt_training_text_v2.1.1.9118.txt} | 92 ++++---- man/ggplot_sir.Rd | 46 +--- man/plot.Rd | 44 +++- pkgdown/extra.css | 5 + 18 files changed, 332 insertions(+), 291 deletions(-) delete mode 100644 PythonPackage/AMR/dist/AMR-2.1.1.9117-py3-none-any.whl create mode 100644 PythonPackage/AMR/dist/AMR-2.1.1.9118-py3-none-any.whl delete mode 100644 PythonPackage/AMR/dist/amr-2.1.1.9117.tar.gz create mode 100644 PythonPackage/AMR/dist/amr-2.1.1.9118.tar.gz rename data-raw/{gpt_training_text_v2.1.1.9117.txt => gpt_training_text_v2.1.1.9118.txt} (99%) diff --git a/.github/workflows/website.yaml b/.github/workflows/website.yaml index 2cee60f4..9ea727bd 100644 --- a/.github/workflows/website.yaml +++ b/.github/workflows/website.yaml @@ -46,6 +46,7 @@ jobs: - uses: actions/checkout@v3 with: # this is to keep timestamps, the default fetch-depth: 1 gets the timestamps of the moment of cloning + # we need this for the download page on our website - dates must be of the files, not of the latest git push fetch-depth: 0 - name: Preserve timestamps @@ -69,7 +70,6 @@ jobs: extra-packages: | any::pkgdown any::tidymodels - any::data.table # Send updates to repo using GH Actions bot - name: Create website in separate branch diff --git a/DESCRIPTION b/DESCRIPTION index e5288d8e..7bde9963 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 2.1.1.9117 -Date: 2024-12-13 +Version: 2.1.1.9118 +Date: 2024-12-14 Title: Antimicrobial Resistance Data Analysis Description: Functions to simplify and standardise antimicrobial resistance (AMR) data analysis and to work with microbial and antimicrobial properties by diff --git a/NEWS.md b/NEWS.md index 527c890b..2d322645 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# AMR 2.1.1.9117 +# AMR 2.1.1.9118 *(this beta version will eventually become v3.0. We're happy to reach a new major milestone soon, which will be all about the new One Health support! Install this beta using [the instructions here](https://msberends.github.io/AMR/#latest-development-version).)* diff --git a/PythonPackage/AMR/AMR.egg-info/PKG-INFO b/PythonPackage/AMR/AMR.egg-info/PKG-INFO index a624844f..00e50958 100644 --- a/PythonPackage/AMR/AMR.egg-info/PKG-INFO +++ b/PythonPackage/AMR/AMR.egg-info/PKG-INFO @@ -1,9 +1,9 @@ Metadata-Version: 2.1 Name: AMR -Version: 2.1.1.9117 +Version: 2.1.1.9118 Summary: A Python wrapper for the AMR R package Home-page: https://github.com/msberends/AMR -Author: Dr. Matthijs Berends +Author: Matthijs Berends Author-email: m.s.berends@umcg.nl License: GPL 2 Project-URL: Bug Tracker, https://github.com/msberends/AMR/issues diff --git a/PythonPackage/AMR/AMR/__init__.py b/PythonPackage/AMR/AMR/__init__.py index 248b12c0..60f4069c 100644 --- a/PythonPackage/AMR/AMR/__init__.py +++ b/PythonPackage/AMR/AMR/__init__.py @@ -117,8 +117,6 @@ from .functions import is_new_episode from .functions import ggplot_pca from .functions import ggplot_sir from .functions import geom_sir -from .functions import theme_sir -from .functions import labels_sir_count from .functions import guess_ab_col from .functions import italicise_taxonomy from .functions import italicize_taxonomy @@ -181,6 +179,8 @@ from .functions import mo_info from .functions import mo_url from .functions import mo_property from .functions import pca +from .functions import theme_sir +from .functions import labels_sir_count from .functions import resistance from .functions import susceptibility from .functions import sir_confidence_interval diff --git a/PythonPackage/AMR/AMR/functions.py b/PythonPackage/AMR/AMR/functions.py index 37decdf6..a2f07d44 100644 --- a/PythonPackage/AMR/AMR/functions.py +++ b/PythonPackage/AMR/AMR/functions.py @@ -381,12 +381,6 @@ def ggplot_sir(*args, **kwargs): def geom_sir(*args, **kwargs): """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" return convert_to_python(amr_r.geom_sir(*args, **kwargs)) -def theme_sir(*args, **kwargs): - """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" - return convert_to_python(amr_r.theme_sir(*args, **kwargs)) -def labels_sir_count(*args, **kwargs): - """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" - return convert_to_python(amr_r.labels_sir_count(*args, **kwargs)) def guess_ab_col(*args, **kwargs): """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" return convert_to_python(amr_r.guess_ab_col(*args, **kwargs)) @@ -573,6 +567,12 @@ def mo_property(*args, **kwargs): def pca(*args, **kwargs): """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" return convert_to_python(amr_r.pca(*args, **kwargs)) +def theme_sir(*args, **kwargs): + """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" + return convert_to_python(amr_r.theme_sir(*args, **kwargs)) +def labels_sir_count(*args, **kwargs): + """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" + return convert_to_python(amr_r.labels_sir_count(*args, **kwargs)) def resistance(*args, **kwargs): """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" return convert_to_python(amr_r.resistance(*args, **kwargs)) diff --git a/PythonPackage/AMR/dist/AMR-2.1.1.9117-py3-none-any.whl b/PythonPackage/AMR/dist/AMR-2.1.1.9117-py3-none-any.whl deleted file mode 100644 index aa9ad7465ac00e4f04085bc16a8f0483cd262076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9962 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 diff --git a/PythonPackage/AMR/dist/AMR-2.1.1.9118-py3-none-any.whl b/PythonPackage/AMR/dist/AMR-2.1.1.9118-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..2c0f62a8b2a2b66cc61619efe26b601b452bc166 GIT binary patch literal 9960 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 literal 0 HcmV?d00001 diff --git a/PythonPackage/AMR/dist/amr-2.1.1.9117.tar.gz b/PythonPackage/AMR/dist/amr-2.1.1.9117.tar.gz deleted file mode 100644 index 7b1f547e2cddd7de3cb4607eb8c121543c64f412..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9721 zcmcI}Wl$VI(4RTF%I{RBh93D&)-GU`Ex0)d1?-aWAXS{fsbjE6Y9pqb#3d_9l zln&dpd7+4rn%;D{X<9WPy=H`V36r=|Smr;I!5W2gGx>@j;;5#xhxdzbSvs)ACqHr6 z{g5@>2P&=koDqw!ZubUL$BbaCf>|7FdzjzC4o~_`7#g)Tc zvUr)MZeyEXJfVI9WP1m&4fiSXiWry*%<@L$cw_$oCVC6|+19wgE-T_q@<382_zRV! zgR0R&CF`+L65)uuF==^xt8&bu->5T7S|Zb5F_n~!Iid|b~q zoLd43LK*e%Nk7t$K!QjiIXgdj)ie{x9pw{_9TxKiwDuC=;1EOU>-p|JPaguKwOaf! zqi}uOq`$b>oX#Ebxq1bUmwaNh8hi=MSK)y6Yus8#J(Rj${g#aB-ff}ba#~Ak-~d6= zB0FPDKZb~oF%h@PO~v!5p?%CiJ<7nL&H>F!;E~{9l!SL+MEFhw^4^T`$|&|!i#`Oy z(W+0+%w^z>-EM~k&VOg<*hl48y(4#$9);gbb|fBmDvKSJ)@xFXxQa@%o24b zit`L89TH&;5JG;Hl7+VL6PV)>+oePz%n`U1Q_((R?QO&h*Weg_>siCjT63x>>}Xd} z#vhBXqYqHYq3Z+i$Vf)}A%7P!GX9dnle?!$XkUFF)N_lDh+N5+4UH1?=;i@z*IO}LP1c{Tw|PsI`X|Pktmr34Av2Zw_*#7!g(5`! zXsSQ3Sbr{Dk>#p{Aj1f+MduRyh#?8!qd+B>g9ar*x`A<4lRa&=Z7&r19Oe4) z=)g6C$DYg;bxAn!NS$eXN*&&&Je)lSay@45CII_|Shvm9?~n1Miw>t|@VgLxWj^fs zk@K83*BdToJ}f)&Kg%}0WvE5DX6vCF#awMzf}WvGxm|f~j9m7E?LM}BY-Gxz~s9oJ!a2eMPGtgj^)la4>1_@!aV_^wi9uc$1~ zA7syrkF;c@u8NSaOOF)iZ_SVAYn_vb>^b9`Gl+0al-NVVg-B{8>PC4hf{dTULO%lG zq)ya*=vu1fmfz9_fTA4dMIuLm*tsRMn8`UtT&kXKnMwpLG{NRurJ)EPN}lp|A4`iO z7BI6Izhit$MW@mf*5jbc4@ZCbK&C>4D$J{VCvI=$P*8l#@OLpxeRAT0w{iT_vl?(}hPQjz!}P^!+np%RrCT zsr{GJ?4m24ZDJj;;tiPEIqY{;RV|EmBirHIvtMi9w2Ge(?2qAG**$D+==M6Q$zp}N z;&F4mXX|xj%8tvog@@lOnFi}A-r2#`;|?f$Bqm4g8^vJZc*guZLUyL)TPzhna@a2$ zk%e@JcKMuXn|tWq-~8!oI*U()u(yGU5RU|W4bz3Z2KvmF0jq4(o0iQ?%@2`kZWCYc zP0N>pSFwS}oY2lZ!sZ>{9(NpE`F!lPme?4LX9VAOVYu#YuanUz@l#fvUcQ%mr%VKQ!hri?Phqu2 zpryfTn+Stn71lsDukY}0I>QP}Pek+VO@A>PN93Xp_qsn0pH&*q^aVZp#3MiJ$xW9N zARh3=`$s>;pp~G)0apv>`!^>VWzG)RzZa!*Ilh@H#W2PwN*?Bzb1aWfmFmotYyFW# z3@76r=5i}T`^K?ajD=OnW|#u0Frb0+r>Uc+n1fd03w8naK0oZorC(ECyv+9XnU1?X zh#rX4Ic#+oVC1||n{vdf!r$!6+goHIeN_$QEp1UVEqs4rhBSd^YAnkL^!Rzx9;=Wz z&XLzp%keD0@RCd_;3PgI0A1USG|o^&a!m+}s7j#ii)t!T+;NNM-8TNCC{K8yl(!mG ze1BK-$Zr_bm*fSRDSD}0wBueqZ=;Y%YHgI}xg#JB;r(<~!>L*Gaym^I`bi2;6upv{ zC!*qTgLY2E0B-(}HaEP}5-f;A>|}nNJmM`P+#u%1lEKRIZ5iD8eY3~WOdK*`onI1r zz~U|BAU=j~LM0J<`1>xxcX`s3x(lCpMocRgl{tA@I&a>d28icdT&I8ZZN+5HLfNfg zt+%^D^d=Og(t9l%j|8N4G;Bx7d8I~o{eg(p5zlOss&=aBl`xDdT`;FS< z!$C!2_&xRKF4W=v!$T>Dy_;9m@rLky?XeVIk|g^5n{ z`a3v2WZsjku1@c_bGY*&B<=~(#W+Z>wHfBR1oNw8KHU<3#zeqms|pO}8kq)} ztJ9_7lQgL8-VL+*I#uqH=Tqu+R~2$q+r zmm}60N~!kT$xHC$Eu%hdabLgM8}B5c=}Euf&ndTNvl?BzNl+}GkY-MbMP1lXjNFA< z^w(koa{@?oY@F6k#K7tX@(beCVsvoS9xq12}xr!PA5n;aTGC63-25&MPhtZ#tXIYvUv0u5l^dr z?^yN%`s=Td8s79L1%gMQI-;b{5woE9+g+tQnpj2Rk*@C9k#vcax$$YVqMo@C-bp^H zVp_d$0NrqmFe7>6KJ)j>Bn^q;V~a9e@_0djlUzq>u76r3%GSMh#Y54}7y`28>@EC< zPxaEV|`MGCS6peo?=e{6f?N}jFcwknxq;7$7;G}YnUOsR0Y2j3&ltVLoRzPAyU$RE$3bPZuz{Q$N9DLJ^>tK)QCB~Bv1M8e0aAVf5^^6h9fv6;Yfpvz+j4&&wLV(_0cO2Y-r<@fkHaBp zKjOw!ObWpS1Pj51^J>#_lWOow64QZEYHyFcsHS=LlD;DxcER)*?7XLye-Sp}D?mgO zf>~9cTMd3M2uD?qzOV7{HvEm1K)z+i2JG7I#_!{l?__bpSR#$y(JcQCRgLi=jk-Es zK>wl>4ytV{ktz8p>F^Jq#R{1s|DhCz!A#{pNK>Yd()&j+;4_%j=>D_d{5L@t|Gz9^ zD9NIF|A7H%TMPdm)M?)h85jQ}0^BVrkglxsTV1H)f&loCOKo1c?K!s!1 z*c!53zt(r2l`MkUTXr^rw4W>HOellc>kfu6D-?M`lly4Ift6%a;k(m!ms+k}f%FQa5NLf9SwE;ZU{wpFVt= zv9(-z_=$XK^e!m7<70(^S3!qkRw5Xo9qUX%c{LbR><3p{J4D3V&&Y2vjJRlFM&ZJc z>HsP)t7RqpEBX`Sp4vWVkYzj2RC^SQ|HNbp9AIuF&~jsiV{+rOfAOq9Pp^RcePZst zryi7rP%u(59V9DB%+Q-&Yr0gvd3sycr^&vR{7d*o%I5fgCn$U@A0u?$Bkoi(4KEb- zPuEZ;ja-|I3H~?@<`#lc6-IVSZk@R>X6Rf6QP=^5ANgj10qjG7k3N07h2UAe3t)Lf z9Q)|Rghu$G=EPR8rhfz|6^;6BZC4bTXJja?7FWqTj${`AmjjpnMGZ?Saw%1XmWdy4 zmE9bHcxhZGMaa8HN$RN6agxLdho%m zX8WK1olq20T#Y-PkGzz4z$sxmUJPBTqFIng;LJB1UdmY`MSou)f<1~EglGv%79EyX}6>f$!_ z`-evzk`KaX?VnKtnTfh-lJ<2K(qv+n$-h+IxW>ZLl^SDp-~1hUDZd&m6%_(HxhBHC ziBayEHMw6Y18w|w7~A+;2#kCEcOT7~Y#YTCG{XjDYbU>tr2Pvk>FIbHckeq0j7t+n zH_<`M2qUh461@^V*k;jKV(Hbd=ve^ftqTN>B}{ZMehTENXx78fY&$j5Qs!5kYFuk8 z665}#i5bDGltq_`E#L3xM%Glzo7E{33(<=NT+7!WcDsIc1YRM#u6Ou!yPXF-xH9?roC z>hMh!&FDU{;bS0!*7lsKlrokYCy{L_A47K>`kv=f7{f&!qRz6A=FLj3@1byodbh$L z0Lz&U)C3aPEd84=9m6Sfk-{Ss+A2De$gNDZ;0hI`ubed6zo6LvyQe9qFxsU^zJ4(J zyn2cqdMH?Q-}4#K z!Pa%I7oR9@V2{FnyzXyD%g0shZ$o`Xv2W)9PpHc?*qMVwXsY#|_sviF6_$w7PXo{E zF3tOq%d=DzY}x*aOK?8tD@W}}Z4w8I_$tsF4QZvt-m~6XNg(d3zbcSc4P16vW<84t zI8&9DZ`BO7E*2tk?Hn|zaXMA^8s%S+$3=3wYpZ%Cdp|smXoZKOl(Bxve>LqF+{k{+ zqX9+!S^^c9?8@w#dWvy6dsB+p+BzMGQajzZFY4I#kGOgjqYN9r7eC_8-XapU8KpA} zoUuo(pU6zR3*@Q8(Hoha)p}>ot(EJC^@$2z)qv&Ie?{i&y`3i!jf8bJIyx zF>mfE^CF($PHI1x0~;Hg1RjHl&K%X)!Z9)8tiiO{4W^4XCe*nVz+qSs;fLci#OCd@I|P@=lW#J zT@XA-_H;OE1TQS8h~xW1ISH9%QIAT{V2gV%*Qrn%GXkKaH0^M&7ln?-A>{k=5MeFU ze6!IxNY;n02!eRuJq+wF3$YXiYix;&;aQ_~?EMNYCuF#EQF(#|6zeJzxZk@E+g@=j zoaqo=dNW;44Ctnru1*!j*WS-=-m{sFnrB&?qd3X%A4TsJ@D4Ov#&cQKzcA65COThEr$~axnFyq0zsV9_=F4Ol5)0Ga+QW2w7}YhoA(+w^9XX8USUP!C{esdY)M= zvUCMn5f3M8%j0yMpggZ|&Xe7fl={m>n73t$+2KU80_sa_p=!?6_jxlO6cM7agHH5V z)AK_0JC|q7f(s6hCsR@CLBz+W*rV@hfRLEa^rpneTxX%(p!jh9X|R|^EkXGCabd{;vA7PYZQlIGP+9@5i$M6oZ8?} z$!RMfrZu&HyCL>Fi|Ypufv#FS7a|qs{OM!MUziyr$D6%Bm=v*Q68f{0(gGA8-u{KE z#S}Zb3mCRq`JniIJrzFE%?{e-{?3Mp{&;Jut*LMRwDhT;Bqs%52A!pz5;+#15K%XU zkn@^Ew!;tImBZ~mpO^;{43R()_S_#oNYD@$QS@xXQzHF^f-0W^dABDBw}gLyX{m0c zPjPezo?56?U#FZocaYK0ec`?-KlXpMYR$|n`dRcE9jMg%OdU- zgA)?$hnK^}ZfNx*L@0LXo(HPL)1gF)=I8R_q05qJ#}@oZe{$;b62+Ti{OV)d;~k$z z?DUQ0W7mxGr49=_XXf8oJ}jk7Y~lEIgf|&YR?1vrbyHmlpGf}^L@wCrp~WnSkocAjfkI#> zclttScarGl>ukl3xtE1TO1Y|kP6R@ZAP$&q{vs>kXB8C77PC|D)xx_n!gGf2Cw^7s zo2+F}c_zB%O2VH-oK__p@o9p53ezqSt)gHN|%(+dS~E+a!0D+jIhg!;~O{OleKi|A-kBpK7mt{YD`) z*N;Tv#(-6Uo@Af2-QK)XCEhud^P|2uDiE=Z7T?>vK^CG^9|FIFZ?V z)pFk5ZEFk@oGXi55P6;Ij~;(q;$TzEiA*@RqGKRGxC+SG;_*7O*iN_1UwW>M#|-RH z>aRN)0Z?T3dRz5nj#TUl;r|+YD;1?#mTqG<%T@zy2J(tBz?&4p>(qZehNGKi8fI~( zdZFeQ8+TtT*IiCg7+OL~Y#wg@WQyxjsopR?r5s}U3my$yd#)_0Td~q5hYI8-Z4qInpj&==&14m#S}cfS5=P0+v_D`_9Zd&*m17t z8<(sUAX>qnRY9lNjmDvfp_=h9RW8!NcBWCXpyDtX5Ax@fv^}h{^v*rdxaf}@an;2C zMph|3)+J;;y?C&rfx_FZ`y%nVsM~9uI?rU-0F;y7`Sa(*elYCzYM1f#<#voV{&{uA_1{<7 z>ic%=Alz1DBzF5To|01n*_&4BzU^waX#61GF7A_CH!wDw!<%(x6lFVaotQykdEU1y z{0WCI0wlMCP~E_(Kaln|E#&QlDMJh*ZlyJn{tA9`q@A7RI?Xal9{A$L0F@e)zoh=| zD3rd>RR%MA4^F&@n}a#NzD}l6Lv>SWHMgZg*3$XVjY-Odz2_J_FZ1k zq`ZIOqvX0n70@<8gY}e{0^{=}X*;81JOh(Y=>_8*G)HL|gEarn>y(A-K-z-~F74+| z@A3u%ID$~*$IOA8@6`Lq4o`5ZMVUYe{7BHDZp4-TD^TN2gT|kV+bgmbeqKJIqq{aO zTTt0Kd$z_?vbB!`n(Pp5z7fOrP)dZ|CjO!KqG>L3qCt>0afOE6@I&3gDJIIw8Lsc+ zH}w>0X{d=dbHVaSWWPWWvcTYAw)Rx5?>JQIkhJ}d@3?~e55MHK#AW8sukeM!wMfdx zZTltPy*iTelco*v8;9&bI5u(AKEmRoC1NsUU{OTgc$QO0+b~OLqHtm0_S;#k0 z#uumG-pr{p?CF0qZxHfI_W`D}8>$DcnpfUH6|=h3C^j^#>+htP5WQ(G3FVo6d99Fo82Gyb}rZCK%q7GzqVBUt3XRfhCO*&I^Sjo*7U zYB7qW70IK3efc+^tARU0vV^OXX2CV(8qVO<9wx>#JPo2Sw%yF_vB~fQHh&e0xG*e0 z!xDrkeZ@gUz`;PT()BbSHl@>XW&~aW578qk@O>n^lm3JS46u{nAg*7O8eAbUQ16zB zheQKVX>0wVCNdu~Gs&=}p^f!^lA~MpOQcPUQ7;zK*JLDt6@P+b0Hv5EZDIM)IVkT3 z@fk~d9+H9PxNnqZ?#?_bp;zts0r&Wm!QT_<9j6qdPF&b+<7pUv1~Scr%2KqIK`gkX zY_I{S(8fmbgkSz&{&FbXk~?~MFOlA?$R>!jN_X^a$X0czCCnj8j`h5VWOf6E{M={c zKTuGQLa9s4*EX>lVp8gzR-?UCb z%%Bsk4poX%u6s{b@d>T`L@^;}KS%J`j@^Ovhkb>12CtnRA!LK{ei+8)yZw&#QLlV~ zkZc^Sx%-Mj^Kec3v`3Y3Zrx3nC^KKH9_RgVH=B_$8}B-B^YEJD3ogi;L~$t{!Wb-1RS22>ILr;bhAY z5wvUz_77st2r9L%-JAHQzizMXr*+~%^)+)n2F+L8^v!Fn?P++;*>=;&4R4Ns zihY>pTh)Knr}Y=+J(!)F?c2FqoTv2diywui;N0>jUH9(1%XHZweIx2d4yS4R1rSIjxP;jQKa)d-@4*3+`tR@IscY> zfCwMFbP2xg%fj5XjzcKGZ!jIIO*?iNI10u^y!Zxt1-ZO5@xAGi!zyB78bf|%(60H* z&7%kK|3CVl`|l0D!``exez05U8BD1+z~}VRkAr0Q6n1t$cntMhBELC$-Mn|0=l4G* z@4m&}@kxBDy(By zlL8j`*u}k+346|W5QJ?GeNOR^D1)MY>Rihs@8#YBZ@!Xds`T=ZpWLf+N~d}Dwg9b@qUZqkN0}>v#1ccoH+SfQY{YIFWs8Qh zW+XD-UzW6-!bO;;NDvLl2w2(iN{P*+9nxcVA1PVr4bw6&!e7&0Hy^7M&nt9RS~v2O z0oSzN9sg~8pY=%DsqQ%k;=LAKz;X1~cMg|aLzuqvBG100@R1w%#fy{gQOfBifGbY; zBq1`i1R=*A7X4{7jN04Jkuu|Z*O4-;i|f;4=TQ`GcVukS(iGmCh+tK zc*mIlMEVub2}GCT$avltt@Ax2JdId||0|44!bfJHGci^#C;}zf_l;M?k zY#slHEIj;|*Is@i_ekbFz+W*Ek%bQQFCPFkkl0RbjfWBzMgd&Uh{Nnbu#8jm#dj_1 z9{c2=*Z64*KJK=&TSk{Grz1>EdK2?QxT&!c4whqQxZn4j75i&$KmR=)pbLV=7t!D3d&RBk8sjq%4KINhiW+vJlDfK7(Q z(*9$ST`s7LEwWQtUi5Fqc~!AY&dMlo0%wsn!L zL`p2w+>vlWMyXjf7L&~h-m$?^{_w97nyhf6|P?TGtvS^H&R^tTFZnHtn@X|?ilHHj$NM;F|yZO^WJADI$~wJ#s8QW zW{MYt1eTQEY}6n%BBJmseuX@Z=}b*ZeTQ>%8ZY>UP+wu<7^`yGzC2*G!Nd?_IkpCvh)+Nv|Ss@YS$I>OZx5f!F0YQn$9 zU|oW0q_t_jbyYKo@Gp9r*7BS1(NO@(2}0O-kk`b@L(C+zU_o+*2m~PS|EB;E{JY*;BN^nm9y+mjv>tvha zdBA11`Gg=6s!X>))gm}>v9&laWMGWnL!v_PUZ#R9&FnCf^MNJnS|k)ljX}>!LE^IN z9iyCpRD_1V^@LCW-Q?m~3w^BStnINl=ysNsffQc)MW`~DHBUNLC8TrCjW6%tNwB=l zcdw$SpVOC;iD>@}kLym%^vOwsoaEc3%NE5XQ`S#cDAD`YwY_Oq+C^6Q+Vu;OlcWnG zwtsC4=T_IZ576vs%0h~xk5m~9T7ewvj0??nqXo$ztP| zqfl>Ajm=3P!g@L3=;WhvKcUnJZ#jR_#;BUY;1MoL#7}zWZeuJ)9PN=sZ6-8O;w)1+ zW}ddl`Hl=5JgGd9KJwe_5BzQS>HyLY*nZxz4R>vvBxJJS5D1|-1qBmk=J0LIYq^Sn ze<)fF;_!dbm%f>-NpNNPm7Bayo#2&{RR)39F63MBr z4pHKGWEWxaOvxxz#4ScsWroe682nMAfYvr{5;p$BGp|wLR%5rrsY$tiS`kZUfukNw z974^szr6`J5r`lf<*4bWl)kI+0(IS7kLSe*N`XoY|FxB{ zTZ5rct%hA5>+4;`G*Wk5_7sAaGqRkp`6<)~M_# zjP2P4(!)oAFIcr3T+!1r@loLIHv)YDJ|ROvf2)22zzqg=gO4a{3yix&R#ch~0bcN- zPowajjW?4AFE7NpN6adA<8lv%Lgm=#Xy0yS+D=J^BlL zCKL6Hl+mlZ9mP@08o*l~Jl-g1ooft@WQaN!M z&^spx-t1%uy-9_p#k^+~D3?c;76S%D*RYQX8DN+m1tR%DW3)-_Nk|0pJ~+ zyW5pcDJ}yHCb6R)k0jJ>av6=6!8(wyA(?Ey%52P%*eD^+GV=<>uj)OJvG~3RS)}tKK1ucWR);SxZd-7Aiz{<8UtF0n4?1YiIWS8sss~e!bhx z>*-4`bXN|>1`oWUSRhhe8K*mO^F4mNULmn&@j65MO&MzuRHfmCQy^0GOW`+AAqWzI zs86G_n=bN6+2Q>VJ}q(;(SQ_CJij?nf^%!=18#V4lxvYJolLX{avGa<4iUES1UYJJ zM+7$KD=jO~=J268X|I>V>sJ4hZq(>Cn+w3QTFR`bl@iL4b+`bpd;mU!?#VmY;`f6+ zD+B`wYy@cQ2a}_nT>;4UV*(y&*-6j&!?6pF3Z1C(VrNmYCaQyau^BtpxJ@;Od-H`P zQcT-vUXrtt^;zi{@L+T29`UmFy%lwS1b=1LL8lu?nAU3r?i<`a`rJ~f5UfU*EQ{Ag zT7#0tNFB1=sU%igs>{h?Hj?|{IM$P-ozewMV=T7U4k7A>~+8LW=^W*a0MK9As z7`r%cziT=w#>1irbe`w$V7H%s`1KHhvRpVTrlaoPE-cf+LY;=Om-L39G}jD1qCE5_ zt;ANeiKW`+zXLft?4}|b%D&?)sdePDn_hoNlYhS=&Q+0$y>=iUe~hpmYIqze3??F0 zz^$Txv$Q;n(U?YU_mmnHg$A9d?7NzF;cy4fL^1NYNSfu@ zoSo5X;!O>>M79sCnIySj$E?k~W6ucg_{C^HcjUVDq6^Wfa7c zBq3toMC9DM6-#Ey}#0~HNke z)t2)6;F|*L%5S_|H)7@{(v8Y%lr&LR{>~>WD(WyL93Yb7PM|@lf*jmHRVB>ju=vEg zYgFCo#P+7YbnzGrLv=aI2fv-f zZ^j95#>$WXqb*Z=`jgfd@I47?EaIlF65?`Pk|wB`8mWpgtam`BOTq$#5E0X3_F|vw zfCZleKre2?#$TZR>mMZp1`xR zINQiI@-6=$)0J#OdInQsoQ73`wxI>69;kj4q(sAdt4Mc@ka|D8AQhv)b`Di)+v=iE zd&T9*+}qi9aK`Gm@LdNzkEyW``8OTQ_}y=X86~obu=r<;x|F+QWbQ>WV9AKW78BDi zM8(O9;`H1KsQTz)Sp16jJ2$j3>7AJO6x$61O*}K#HN$b(9$3A0wroE^V@3B~jT!)+ zX*#tT=($gWm`cCT&|E2SFqkpIKEvPe5UqZNV7TsE^+*}f9Ub1mN)4_>6Gpp*mr=4B z&7zsWSpRf#Zo@zxLNd7X^i5pjw;-&?o6S&oSvUHQuy1blq z(2754U6v_m_Z4!9MGC0-Z*n#T$syxs^=+eTnbo!rtbli|MG+JU4u|u1NHn%|7Ofy? zUg)8QiP-_VBvJ3L4P^H z-L*yTx?MLBDGXF|WoIF`xNTW0;um}f(rtuduSV{h$cRQ$enQbWtSuLBACejWK?18V z4i_%pdakr@n#K~gG&;Th94!8GRc$8?T9g8hJ4^K;Xrm*+o?UPLC-DK<%X*2C+1;!{ z!^_d5gCN?Jj(6aVp2c5RZeRQjE*$7Q7~K7Pw)(w9r;0`X6(`*p>|u z*&jL*GFMPS@p9k)r!~9JW@Ex33P5gZ02Nx-$%KDiHg#(?Z>O!i`tuO;vy;y5(ZzKh z1(w6TEss!qwqJjpm#DyUC-k}-dRFkD7r&?V?U#LY*i!eD{V^<^tDxj&bUgUg_v#2~ z@*mho=Kw2b$-k#rL3EBop)3-uAb2Ru*6%~v+8_nz-b_> zetQ~E$0jp3@;_(63deAc<7)fZ=iUto3`-X=l13W~L%c^H0XI^n@jD!j-3q};z@ z7Z${bCrYf+Bk?Y~ZypXkhTftl`R5`sPvL8INLA37+%+U-O19a@`LGq%pqaNjH^#9t z+=Sk8HxXK8B*%O`-5_(f)7xYdFA$f?o>OUy86(?8W;vl${+x04&+3+o6lHH865a7a?MA#bIW{jmoMFVN7ggdZL$n*@Ba3 z=3{-+<$a+zxD@3o&tO;GM3}tDz&BGaZX6Y2nji&=pqFjbk;y_uOD?AQ#C8zb5_RDr zWpSkL@?l^Sdm3H->sgn~@I_h5o%~w5t^r@BwrgO1;G^yB(}T*by;GKzUR`zV+Wgiw38Ngjz4PtQ7g#SJeWghZZ?+E#=lEmw*b zPsn<3|AMpkz|I139|^_1|2`(NjETVTC6saC9jOGc^uy5{rHK|Me^NAa{KS7rugNQKRIc z8lDndg&pptLpSHVzdHC9OIX`jq*~J38icnfKSLojA@AJV@aKAy9Yh<$s+Mo+?CGwQ z`;l#wC1kkQp{%F`u$}wIbN?>6miChmF&PPbYAz^I0{)i$G0(c*k>nG-UcelSwF^EK^nV;lZtw$fhtl%Y34m5)Ot`MtC04uCU zbg9q^pkcwZ+$LL+`!9Zs%B%xGk6JKLXpUr2Te6R-FxJJ$E~ zFLpv;{v%NEIF3m5r;{_C=+&0rt{`O6W%qaQK76vh7W9-}zJJ8@0q=}=q1f?$u^)EX z*lU|+yz|rv^6xU{PEK{0^?e~BUiIDe7gRJtsQf5h7&iTX4qU?N>5svuZhRg#7;|H* zXa>;EH%TMC?%V8HMLbxN7gtFyhYaRMz7V9bzh3R*B-U!Xc^lo>)#5t;>|=t? zUHMc|K`klXb!sZiP9_}h_ifjIxC?i%f#!IEE51WX&tu0hd7fL%l}X}zd!va3ZHJ*k zR~L3uoWJIVn#ZlJ*=uLKTnK5KpvbYZzbPK`_VQRXt3}tvE`afc|AkcbHI70%rdIs+ zTxp0pGLLp*+nS(RkKhYW%PaWk31!6QyV&61&XOSVHg;KvGy5edN6fc|&^Z5$_^R4x z$jy_~E3=1+(ws;!l&FYIoJn-YTkLa*dXPF7qT|Av{2M2Sv2mcPxiF5;0^1(amh{3W zh~43Es3Iu+pU>6 z(^!fZWq;xqY?P5_sNqF~U4kF9ws@IzqoE2VKf>?|h2B!j4Wi&*KlPoi#32gVz3{Y% zV>@!a8}BDPva>e-j;pU#5^)cn@COK3sk0*~I9zcLL|#%RY;r?+$9$C4bMQq`N+e;n z=20s<6k7K4^Cnt;Z8+f;Xk}_y#GD8<2jbk{@OZtJ!K8*xB~Eq;F&&Np0*?ucdRm_PPtVvbObe{kC7$tZ_Ak=s?Fo9d(U2aqRU z+9C7fJOd(6wD*eK7BG;Yd~dRzxm~U}*{uwxc({7!kG;g-j5VhtXXudh(lup66J}wr zM-xf;ldTQbB0PQHy>+R3Mxc@?)Z%RQvSkMPnk96Ji_54AXA7%)OjNu(A)i&()?E-l z>g$m@;enS?T4Fqg@!k?4Ay@s_TB0{`*=+RmjAbWESQCo!_b^KXXVsud<5}acSEtpDWlq@~HqQt!$k(m~A6{iK60b^3Yat3m#J&I`{lAjwX*bJ@m8$dUQo4k}^ zWFvL5QJ09xXp*)(0^47&qCa|Z$FD)(1mD&in|7&^1*=8cSfm&C<}kpZCLp%xffCb# zN)>fwbIhh5qt%HH$HAgv!TDi*rp7&(jeyXgScZ$;|fiN#*HaSYcBJSE_M{Y zm&dLUu}j`qP-zqvRvE&$3)Vz>>sJ2*Q= zcshhFAah_$DE}?ru6+X&u1d(3`LQ~y=jfA zu)KTL7@<1)#7Uv7Pbrrw#xHthSvULTsXbaPh>loEheDe5>Z`qr)f7RrJWcS!V_ zXYfd#f>iYY&4z^lJKGcUd|n?-5M>wg;)+Fxj#uGyKU~y|(cnDT8+XaP<{)we1%4yJ zAwJKr4cB#82nXYR*r+r0wgZ|ERSCP&Y~PP4MghLVpMpVPCcpE08{HbiV=W6!s7VF( z4U6CH-Y7js!5W9PtNm}};e&==2Mqbgc}GRy(b6EliAs_}-#5D;ybC2E2n8PG24q77 z@K^!{HyQt#ObhKICtolP8&@p?P&$uUo0XeKi*gMY7Wz5eFE!f+V9zr%Cp?kGJfG%- z9E%&OEJO6Y%iOIWCMt~vftt&}pGBi5T_5<WK~~AIDm05~ZmmaF z`&jdlWR97j!cIvp=B_!Xv|u92#L`4?!q5p%*kP;>Mm=36D~L9p9p@ib{x{Cm%aq+{ zDF)k@6>HWQ3<^ifZN#qO*$6YFt`!j~!HDc$X~(nvOZV*^+|+ zn=+h%I%jfAY+`4<2Kn9oxQ%mAnFvD{HoZXtPrFx(pvM#%Gom&Skidj~Q2dR>Gi(Uw z1aw-*P_}hKCx(TApCd7}l>+d?u&$e#VSh5p12@1>y&QWg(`{i4!4iZcVGsiSg)r== zlS2q5eb=^XzX;~3@OhnBZ(=A%@om-OG#VXiD9}W2eViRk>b?%2WvWs95!_CA?{P{%#B_V|&5593>D2xA{Mw|KUPV={xZ-(fS4P0!NV# z8TC1OX497s1Eu~}&dP!<65#v|i+j04bJgtH&UIxgZ&dmhHtxX@Y!bpfDL8KKuMW98 zCiw%iJGVihJgmY_LOr;nj)UlYnLnMW7x&{HeR6Cs?*3V~PbJPyYW`iF(Wc|O)UKs&@DF7xyC29aebN>n2ML_*(q(^InF)( z)c3@*B|^h3xl@T?s!S8yJrVv=;MI;@gx;8M?>LzGu<5@lR39z-dIWEfl9Q2oz8U`F ztNrstpvnxIXzpnXDJ|LCkzm^4o|JBN3UTkTZjLp2?zbd53%>1 zo@sJ$a6b7L-hzXtvKiST)J*;F3cRLYcaE~O5!JpERajD zmtXAu7+pPIdkYZAT)ZaSF#erTFDb82$Li7V?D30lCVQ0WR;SwWVrx_37zLf^@i3cK zqIZ=tYPG2DGf0M0uRj!a{xqZv2n_>+8Y^)R`$9{X0gb;WNmukRcXjt4T8~tJFAq|y z;lOJQ^h#LwheU&>?E)To-jsOE`zm2trwvX=&jbP0qFq0iZ7$-!!9C0EvSxhS)YC^8 zTvE0-nLH3>QE9ls9z?Ou=*oDXnWB2;VT}qFQ+&4;!RTMfiV=b+7t-u(kEX}6fTHHLNgpsQ|yTlD^+*Dw%lXl9KMn2 z|H3U)TBHr-?=?L4|Ay&OKok1|pX*d#hq{ zQtw<9Px(TCBEPM!Hly=#2VhfUE`dWUSSv zmPDTT2tV2oR6;FBNJ4%^jw1WR795k-{~_VDWW;(~KsxPagU}+1%_myPRd{)co~V&{ zw{>>G-V&mp$MDkO=@(GNb|^u(tVC=fdW6k3vE}`W;(Bfe`mh1;B!Nx| z{3a^5*2zgp#{wzgZk>5H$Vu;)BQ6%!qMV`O%!E;k@KK7X(9wtQ{(%MqHA*Y-n}_?I z%f@8(+OcaeCfn7zwr4aS_reb~V~Na&1}t6p@0;V?=#0`uTwDr5*mZWn;Z9+9Mn(tS z>iOcT2rQ>>%aYtf%xzQe42L=KR~^G#V$CKUZbL#X`<8q?tNaEQmwbVUY@)~o5e95_ zdut926+zNhxt=$F9?jUDpCF9xTl^(asy3^WE;ahJ-HCd6(kyefn>*$lfx5x-IpWd@ z=ZQryvyE8>SjOIM2`rm6QmP|QIXAHp?zm#B2le-!4ub=yF_2Fo_a9N`GEiMTPR6R{;$eVu=a6Jc7Z)V^&!ajiQWy0l=mSwP~ zD5(SMnDBbS`@#(}O{9t-9Zj#j-2AevQtg?HewphREAgLe${CTkpXQZ4d|dg0y}H4j zJxulBx6_C9N%|w*yluYch_~L(e-d@ATpzN765Zf8iQ37##tQaXp_Ww)eG{QgC}a5Z zGeK{e;M&n%7oyS3$D6Amy)?u#a#Wt%js;hlF4DDc$J^WnZ)Z3Lj>bl_hz6>y$GLid z_Q>TsfCzZyzaiQ21Md#d+Q|ie>Wl>S$XQ`AQ*N}SMxok0$_VqTmNK6~l?3}>1&DYQ~U}NU}b<#ty^34`pNvJOfEKw`?p-&2~ zNdW7N0;>0V|J-byK0A55xBj2epJ{k~tE&Qld4KhSUtOL6^gDe$kI!NxXm^i*C%=+E zH-I_P`!moMy33!=pfkh12exfreCKZDwoO=rE2vs8$d&&K8mvDG_;B16OY|Lmpa4NW zfn_2gh*M7nhXEsdG?|BwE%^4$#S^X3MNv^6D6T)Fl#NQxXhZ1O@d=tW>y_FP zpSj)wFMZaPL{6|@Y@O%_?i~PKaP#ziiyZAUFO+P*r>ONv#V~FT@VcKBvk={s3}2rE zODHw;&7`>4JaYN^Tb*Qx(~jo9U{*{wagXOd-z=65=v^@AUVbd^HOi=N@$Y_Zq+_ET zmmG3($(7)v^j)XX+*h%snu!+pQA%`). See *Examples*. #' @rdname ggplot_sir @@ -344,187 +341,3 @@ geom_sir <- function(position = NULL, ... ) } - -#' @rdname ggplot_sir -#' @export -facet_sir <- function(facet = c("interpretation", "antibiotic"), nrow = NULL) { - facet <- facet[1] - stop_ifnot_installed("ggplot2") - meet_criteria(facet, allow_class = "character", has_length = 1) - meet_criteria(nrow, allow_class = c("numeric", "integer"), has_length = 1, allow_NULL = TRUE, is_positive = TRUE, is_finite = TRUE) - - # we work with aes_string later on - facet_deparse <- deparse(substitute(facet)) - if (facet_deparse != "facet") { - facet <- facet_deparse - } - if (facet %like% '".*"') { - facet <- substr(facet, 2, nchar(facet) - 1) - } - - if (tolower(facet) %in% tolower(c("SIR", "sir", "interpretations", "result"))) { - facet <- "interpretation" - } else if (tolower(facet) %in% tolower(c("ab", "abx", "antibiotics"))) { - facet <- "antibiotic" - } - - ggplot2::facet_wrap(facets = facet, scales = "free_x", nrow = nrow) -} - -#' @rdname ggplot_sir -#' @export -scale_y_percent <- function(breaks = function(x) seq(0, max(x, na.rm = TRUE), 0.1), limits = NULL) { - stop_ifnot_installed("ggplot2") - meet_criteria(breaks, allow_class = c("numeric", "integer", "function")) - meet_criteria(limits, allow_class = c("numeric", "integer"), has_length = 2, allow_NULL = TRUE, allow_NA = TRUE) - - if (!is.function(breaks) && all(breaks[breaks != 0] > 1)) { - breaks <- breaks / 100 - } - ggplot2::scale_y_continuous( - breaks = breaks, - labels = if (is.function(breaks)) function(x) percentage(breaks(x)) else percentage(breaks), - limits = limits - ) -} - -#' @rdname ggplot_sir -#' @export -scale_sir_colours <- function(..., - aesthetics = "fill") { - stop_ifnot_installed("ggplot2") - meet_criteria(aesthetics, allow_class = "character", is_in = c("alpha", "colour", "color", "fill", "linetype", "shape", "size")) - # behaviour until AMR pkg v1.5.0 and also when coming from ggplot_sir() - if ("colours" %in% names(list(...))) { - original_cols <- c( - S = "#3CAEA3", - SI = "#3CAEA3", - I = "#F6D55C", - IR = "#ED553B", - R = "#ED553B" - ) - colours <- replace(original_cols, names(list(...)$colours), list(...)$colours) - # limits = force is needed in ggplot2 3.3.4 and 3.3.5, see here; - # https://github.com/tidyverse/ggplot2/issues/4511#issuecomment-866185530 - return(ggplot2::scale_fill_manual(values = colours, limits = force)) - } - if (identical(unlist(list(...)), FALSE)) { - return(invisible()) - } - - names_susceptible <- c( - "S", "SI", "IS", "S+I", "I+S", "susceptible", "Susceptible", - unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Susceptible"), - "replacement", - drop = TRUE - ]) - ) - names_incr_exposure <- c( - "I", "intermediate", "increased exposure", "incr. exposure", - "Increased exposure", "Incr. exposure", "Susceptible, incr. exp.", - unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Intermediate"), - "replacement", - drop = TRUE - ]), - unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Susceptible, incr. exp."), - "replacement", - drop = TRUE - ]) - ) - names_resistant <- c( - "R", "IR", "RI", "R+I", "I+R", "resistant", "Resistant", - unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Resistant"), - "replacement", - drop = TRUE - ]) - ) - - susceptible <- rep("#3CAEA3", length(names_susceptible)) - names(susceptible) <- names_susceptible - incr_exposure <- rep("#F6D55C", length(names_incr_exposure)) - names(incr_exposure) <- names_incr_exposure - resistant <- rep("#ED553B", length(names_resistant)) - names(resistant) <- names_resistant - - original_cols <- c(susceptible, incr_exposure, resistant) - dots <- c(...) - # replace S, I, R as colours: scale_sir_colours(mydatavalue = "S") - dots[dots == "S"] <- "#3CAEA3" - dots[dots == "I"] <- "#F6D55C" - dots[dots == "R"] <- "#ED553B" - cols <- replace(original_cols, names(dots), dots) - # limits = force is needed in ggplot2 3.3.4 and 3.3.5, see here; - # https://github.com/tidyverse/ggplot2/issues/4511#issuecomment-866185530 - ggplot2::scale_discrete_manual(aesthetics = aesthetics, values = cols, limits = force) -} - -#' @rdname ggplot_sir -#' @export -theme_sir <- function() { - stop_ifnot_installed("ggplot2") - ggplot2::theme_minimal(base_size = 10) + - ggplot2::theme( - panel.grid.major.x = ggplot2::element_blank(), - panel.grid.minor = ggplot2::element_blank(), - panel.grid.major.y = ggplot2::element_line(colour = "grey75"), - # center title and subtitle - plot.title = ggplot2::element_text(hjust = 0.5), - plot.subtitle = ggplot2::element_text(hjust = 0.5) - ) -} - -#' @rdname ggplot_sir -#' @export -labels_sir_count <- function(position = NULL, - x = "antibiotic", - translate_ab = "name", - minimum = 30, - language = get_AMR_locale(), - combine_SI = TRUE, - datalabels.size = 3, - datalabels.colour = "grey15") { - stop_ifnot_installed("ggplot2") - meet_criteria(position, allow_class = "character", has_length = 1, is_in = c("fill", "stack", "dodge"), allow_NULL = TRUE) - meet_criteria(x, allow_class = "character", has_length = 1) - meet_criteria(translate_ab, allow_class = c("character", "logical"), has_length = 1, allow_NA = TRUE) - meet_criteria(minimum, allow_class = c("numeric", "integer"), has_length = 1, is_positive_or_zero = TRUE, is_finite = TRUE) - language <- validate_language(language) - meet_criteria(combine_SI, allow_class = "logical", has_length = 1) - meet_criteria(datalabels.size, allow_class = c("numeric", "integer"), has_length = 1, is_positive = TRUE, is_finite = TRUE) - meet_criteria(datalabels.colour, allow_class = "character", has_length = 1) - - if (is.null(position)) { - position <- "fill" - } - if (identical(position, "fill")) { - position <- ggplot2::position_fill(vjust = 0.5, reverse = TRUE) - } - x_name <- x - ggplot2::geom_text( - mapping = ggplot2::aes_string( - label = "lbl", - x = x, - y = "value" - ), - position = position, - inherit.aes = FALSE, - size = datalabels.size, - colour = datalabels.colour, - lineheight = 0.75, - data = function(x) { - transformed <- sir_df( - data = x, - translate_ab = translate_ab, - combine_SI = combine_SI, - minimum = minimum, - language = language - ) - transformed$gr <- transformed[, x_name, drop = TRUE] - transformed %pm>% - pm_group_by(gr) %pm>% - pm_mutate(lbl = paste0("n=", isolates)) %pm>% - pm_ungroup() %pm>% - pm_select(-gr) - } - ) -} diff --git a/R/plotting.R b/R/plotting.R index 1ea16e64..e0067178 100755 --- a/R/plotting.R +++ b/R/plotting.R @@ -27,7 +27,7 @@ # how to conduct AMR data analysis: https://msberends.github.io/AMR/ # # ==================================================================== # -#' Plotting for Classes `sir`, `mic` and `disk` +#' Plotting Helpers for AMR Data Analysis #' #' @description #' Functions to plot classes `sir`, `mic` and `disk`, with support for base \R and `ggplot2`. @@ -49,6 +49,16 @@ #' For interpreting MIC values as well as disk diffusion diameters, supported guidelines to be used as input for the `guideline` argument are: `r vector_and(AMR::clinical_breakpoints$guideline, quotes = TRUE, reverse = TRUE)`. #' #' Simply using `"CLSI"` or `"EUCAST"` as input will automatically select the latest version of that guideline. +#' +#' ### Additional `ggplot2` Functions +#' +#' This package contains several functions that extend the `ggplot2` package, to help in visualising AMR data results. All these functions are internally used by [ggplot_sir()] too. +#' +#' * [facet_sir()] creates 2d plots (at default based on S/I/R) using [ggplot2::facet_wrap()]. +#' * [scale_y_percent()] transforms the y axis to a 0 to 100% range using [ggplot2::scale_y_continuous()]. +#' * [scale_sir_colours()] sets colours to the bars (green for S, yellow for I, and red for R). Has multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. +#' * [theme_sir()] is a [ggplot2 theme][[ggplot2::theme()] with minimal distraction. +#' * [labels_sir_count()] print datalabels on the bars with percentage and number of isolates, using [ggplot2::geom_text()]. #' @name plot #' @rdname plot #' @return The `autoplot()` functions return a [`ggplot`][ggplot2::ggplot()] model that is extendible with any `ggplot2` function. @@ -915,3 +925,192 @@ plot_colours_subtitle_guideline <- function(x, mo, ab, guideline, colours_SIR, f list(cols = cols, count = as.double(x), sub = sub, guideline = guideline) } + +#' @rdname plot +#' @export +facet_sir <- function(facet = c("interpretation", "antibiotic"), nrow = NULL) { + facet <- facet[1] + stop_ifnot_installed("ggplot2") + meet_criteria(facet, allow_class = "character", has_length = 1) + meet_criteria(nrow, allow_class = c("numeric", "integer"), has_length = 1, allow_NULL = TRUE, is_positive = TRUE, is_finite = TRUE) + + # we work with aes_string later on + facet_deparse <- deparse(substitute(facet)) + if (facet_deparse != "facet") { + facet <- facet_deparse + } + if (facet %like% '".*"') { + facet <- substr(facet, 2, nchar(facet) - 1) + } + + if (tolower(facet) %in% tolower(c("SIR", "sir", "interpretations", "result"))) { + facet <- "interpretation" + } else if (tolower(facet) %in% tolower(c("ab", "abx", "antibiotics"))) { + facet <- "antibiotic" + } + + ggplot2::facet_wrap(facets = facet, scales = "free_x", nrow = nrow) +} + +#' @rdname plot +#' @export +scale_y_percent <- function(breaks = function(x) seq(0, max(x, na.rm = TRUE), 0.1), limits = NULL) { + stop_ifnot_installed("ggplot2") + meet_criteria(breaks, allow_class = c("numeric", "integer", "function")) + meet_criteria(limits, allow_class = c("numeric", "integer"), has_length = 2, allow_NULL = TRUE, allow_NA = TRUE) + + if (!is.function(breaks) && all(breaks[breaks != 0] > 1)) { + breaks <- breaks / 100 + } + ggplot2::scale_y_continuous( + breaks = breaks, + labels = if (is.function(breaks)) function(x) percentage(breaks(x)) else percentage(breaks), + limits = limits + ) +} + +#' @rdname plot +#' @export +scale_sir_colours <- function(..., + aesthetics = "fill", + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B")) { + stop_ifnot_installed("ggplot2") + meet_criteria(aesthetics, allow_class = "character", is_in = c("alpha", "colour", "color", "fill", "linetype", "shape", "size")) + meet_criteria(colours_SIR, allow_class = "character", has_length = c(1, 3)) + if (length(colours_SIR) == 1) { + colours_SIR <- rep(colours_SIR, 3) + } + # behaviour until AMR pkg v1.5.0 and also when coming from ggplot_sir() + if ("colours" %in% names(list(...))) { + original_cols <- c( + S = colours_SIR[1], + SI = colours_SIR[1], + I = colours_SIR[2], + IR = colours_SIR[3], + R = colours_SIR[3] + ) + colours <- replace(original_cols, names(list(...)$colours), list(...)$colours) + # limits = force is needed in ggplot2 3.3.4 and 3.3.5, see here; + # https://github.com/tidyverse/ggplot2/issues/4511#issuecomment-866185530 + return(ggplot2::scale_fill_manual(values = colours, limits = force)) + } + if (identical(unlist(list(...)), FALSE)) { + return(invisible()) + } + + names_susceptible <- c( + "S", "SI", "IS", "S+I", "I+S", "susceptible", "Susceptible", + unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Susceptible"), + "replacement", + drop = TRUE + ]) + ) + names_incr_exposure <- c( + "I", "intermediate", "increased exposure", "incr. exposure", + "Increased exposure", "Incr. exposure", "Susceptible, incr. exp.", + unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Intermediate"), + "replacement", + drop = TRUE + ]), + unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Susceptible, incr. exp."), + "replacement", + drop = TRUE + ]) + ) + names_resistant <- c( + "R", "IR", "RI", "R+I", "I+R", "resistant", "Resistant", + unique(TRANSLATIONS[which(TRANSLATIONS$pattern == "Resistant"), + "replacement", + drop = TRUE + ]) + ) + + susceptible <- rep(colours_SIR[1], length(names_susceptible)) + names(susceptible) <- names_susceptible + incr_exposure <- rep(colours_SIR[2], length(names_incr_exposure)) + names(incr_exposure) <- names_incr_exposure + resistant <- rep(colours_SIR[3], length(names_resistant)) + names(resistant) <- names_resistant + + original_cols <- c(susceptible, incr_exposure, resistant) + dots <- c(...) + # replace S, I, R as colours: scale_sir_colours(mydatavalue = "S") + dots[dots == "S"] <- colours_SIR[1] + dots[dots == "I"] <- colours_SIR[2] + dots[dots == "R"] <- colours_SIR[3] + cols <- replace(original_cols, names(dots), dots) + # limits = force is needed in ggplot2 3.3.4 and 3.3.5, see here; + # https://github.com/tidyverse/ggplot2/issues/4511#issuecomment-866185530 + ggplot2::scale_discrete_manual(aesthetics = aesthetics, values = cols, limits = force) +} + +#' @rdname plot +#' @export +theme_sir <- function() { + stop_ifnot_installed("ggplot2") + ggplot2::theme_minimal(base_size = 10) + + ggplot2::theme( + panel.grid.major.x = ggplot2::element_blank(), + panel.grid.minor = ggplot2::element_blank(), + panel.grid.major.y = ggplot2::element_line(colour = "grey75"), + # center title and subtitle + plot.title = ggplot2::element_text(hjust = 0.5), + plot.subtitle = ggplot2::element_text(hjust = 0.5) + ) +} + +#' @rdname plot +#' @export +labels_sir_count <- function(position = NULL, + x = "antibiotic", + translate_ab = "name", + minimum = 30, + language = get_AMR_locale(), + combine_SI = TRUE, + datalabels.size = 3, + datalabels.colour = "grey15") { + stop_ifnot_installed("ggplot2") + meet_criteria(position, allow_class = "character", has_length = 1, is_in = c("fill", "stack", "dodge"), allow_NULL = TRUE) + meet_criteria(x, allow_class = "character", has_length = 1) + meet_criteria(translate_ab, allow_class = c("character", "logical"), has_length = 1, allow_NA = TRUE) + meet_criteria(minimum, allow_class = c("numeric", "integer"), has_length = 1, is_positive_or_zero = TRUE, is_finite = TRUE) + language <- validate_language(language) + meet_criteria(combine_SI, allow_class = "logical", has_length = 1) + meet_criteria(datalabels.size, allow_class = c("numeric", "integer"), has_length = 1, is_positive = TRUE, is_finite = TRUE) + meet_criteria(datalabels.colour, allow_class = "character", has_length = 1) + + if (is.null(position)) { + position <- "fill" + } + if (identical(position, "fill")) { + position <- ggplot2::position_fill(vjust = 0.5, reverse = TRUE) + } + x_name <- x + ggplot2::geom_text( + mapping = ggplot2::aes_string( + label = "lbl", + x = x, + y = "value" + ), + position = position, + inherit.aes = FALSE, + size = datalabels.size, + colour = datalabels.colour, + lineheight = 0.75, + data = function(x) { + transformed <- sir_df( + data = x, + translate_ab = translate_ab, + combine_SI = combine_SI, + minimum = minimum, + language = language + ) + transformed$gr <- transformed[, x_name, drop = TRUE] + transformed %pm>% + pm_group_by(gr) %pm>% + pm_mutate(lbl = paste0("n=", isolates)) %pm>% + pm_ungroup() %pm>% + pm_select(-gr) + } + ) +} diff --git a/data-raw/_generate_python_wrapper.sh b/data-raw/_generate_python_wrapper.sh index 5a5aa6f0..609547c7 100644 --- a/data-raw/_generate_python_wrapper.sh +++ b/data-raw/_generate_python_wrapper.sh @@ -274,7 +274,7 @@ setup( 'numpy', 'pandas', ], - author='Dr. Matthijs Berends', + author='Matthijs Berends', author_email='m.s.berends@umcg.nl', description='A Python wrapper for the AMR R package', long_description=open('README.md').read(), diff --git a/data-raw/gpt_training_text_v2.1.1.9117.txt b/data-raw/gpt_training_text_v2.1.1.9118.txt similarity index 99% rename from data-raw/gpt_training_text_v2.1.1.9117.txt rename to data-raw/gpt_training_text_v2.1.1.9118.txt index 2db072aa..09a5cab3 100644 --- a/data-raw/gpt_training_text_v2.1.1.9117.txt +++ b/data-raw/gpt_training_text_v2.1.1.9118.txt @@ -1,5 +1,5 @@ This files contains all context you must know about the AMR package for R. -First and foremost, you are trained on version 2.1.1.9117. Remember this whenever someone asks which AMR package version you’re at. +First and foremost, you are trained on version 2.1.1.9118. Remember this whenever someone asks which AMR package version you’re at. -------------------------------- THE PART HEREAFTER CONTAINS CONTENTS FROM FILE 'NAMESPACE': @@ -5365,11 +5365,6 @@ THE PART HEREAFTER CONTAINS CONTENTS FROM FILE 'man/ggplot_sir.Rd': \name{ggplot_sir} \alias{ggplot_sir} \alias{geom_sir} -\alias{facet_sir} -\alias{scale_y_percent} -\alias{scale_sir_colours} -\alias{theme_sir} -\alias{labels_sir_count} \title{AMR Plots with \code{ggplot2}} \usage{ ggplot_sir( @@ -5408,28 +5403,6 @@ geom_sir( combine_SI = TRUE, ... ) - -facet_sir(facet = c("interpretation", "antibiotic"), nrow = NULL) - -scale_y_percent( - breaks = function(x) seq(0, max(x, na.rm = TRUE), 0.1), - limits = NULL -) - -scale_sir_colours(..., aesthetics = "fill") - -theme_sir() - -labels_sir_count( - position = NULL, - x = "antibiotic", - translate_ab = "name", - minimum = 30, - language = get_AMR_locale(), - combine_SI = TRUE, - datalabels.size = 3, - datalabels.colour = "grey15" -) } \arguments{ \item{data}{a \link{data.frame} with column(s) of class \code{\link{sir}} (see \code{\link[=as.sir]{as.sir()}})} @@ -5483,23 +5456,20 @@ Use these functions to create bar plots for AMR data analysis. All functions rel } \details{ At default, the names of antibiotics will be shown on the plots using \code{\link[=ab_name]{ab_name()}}. This can be set with the \code{translate_ab} argument. See \code{\link[=count_df]{count_df()}}. -\subsection{The Functions}{ \code{\link[=geom_sir]{geom_sir()}} will take any variable from the data that has an \code{\link{sir}} class (created with \code{\link[=as.sir]{as.sir()}}) using \code{\link[=sir_df]{sir_df()}} and will plot bars with the percentage S, I, and R. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis. -\code{\link[=facet_sir]{facet_sir()}} creates 2d plots (at default based on S/I/R) using \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}}. - -\code{\link[=scale_y_percent]{scale_y_percent()}} transforms the y axis to a 0 to 100\% range using \code{\link[ggplot2:scale_continuous]{ggplot2::scale_y_continuous()}}. - -\code{\link[=scale_sir_colours]{scale_sir_colours()}} sets colours to the bars (green for S, yellow for I, and red for R). with multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. - -\code{\link[=theme_sir]{theme_sir()}} is a [ggplot2 theme][\code{\link[ggplot2:theme]{ggplot2::theme()}} with minimal distraction. - -\code{\link[=labels_sir_count]{labels_sir_count()}} print datalabels on the bars with percentage and amount of isolates using \code{\link[ggplot2:geom_text]{ggplot2::geom_text()}}. +Additional functions include: +\itemize{ +\item \code{\link[=facet_sir]{facet_sir()}} creates 2d plots (at default based on S/I/R) using \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}}. +\item \code{\link[=scale_y_percent]{scale_y_percent()}} transforms the y axis to a 0 to 100\% range using \code{\link[ggplot2:scale_continuous]{ggplot2::scale_y_continuous()}}. +\item \code{\link[=scale_sir_colours]{scale_sir_colours()}} sets colours to the bars (green for S, yellow for I, and red for R). with multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. +\item \code{\link[=theme_sir]{theme_sir()}} is a [ggplot2 theme][\code{\link[ggplot2:theme]{ggplot2::theme()}} with minimal distraction. +\item \code{\link[=labels_sir_count]{labels_sir_count()}} print datalabels on the bars with percentage and amount of isolates using \code{\link[ggplot2:geom_text]{ggplot2::geom_text()}}. +} \code{\link[=ggplot_sir]{ggplot_sir()}} is a wrapper around all above functions that uses data as first input. This makes it possible to use this function after a pipe (\verb{\%>\%}). See \emph{Examples}. } -} \examples{ \donttest{ if (require("ggplot2") && require("dplyr")) { @@ -7437,7 +7407,12 @@ THE PART HEREAFTER CONTAINS CONTENTS FROM FILE 'man/plot.Rd': \alias{plot.sir} \alias{autoplot.sir} \alias{fortify.sir} -\title{Plotting for Classes \code{sir}, \code{mic} and \code{disk}} +\alias{facet_sir} +\alias{scale_y_percent} +\alias{scale_sir_colours} +\alias{theme_sir} +\alias{labels_sir_count} +\title{Plotting Helpers for AMR Data Analysis} \usage{ scale_x_mic(keep_operators = "edges", mic_range = NULL, drop = FALSE, ...) @@ -7535,6 +7510,32 @@ scale_fill_mic(keep_operators = "edges", mic_range = NULL, drop = FALSE, ...) ) \method{fortify}{sir}(object, ...) + +facet_sir(facet = c("interpretation", "antibiotic"), nrow = NULL) + +scale_y_percent( + breaks = function(x) seq(0, max(x, na.rm = TRUE), 0.1), + limits = NULL +) + +scale_sir_colours( + ..., + aesthetics = "fill", + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B") +) + +theme_sir() + +labels_sir_count( + position = NULL, + x = "antibiotic", + translate_ab = "name", + minimum = 30, + language = get_AMR_locale(), + combine_SI = TRUE, + datalabels.size = 3, + datalabels.colour = "grey15" +) } \arguments{ \item{keep_operators}{a \link{character} specifying how to handle operators (such as \code{>} and \code{<=}) in the input. Accepts one of three values: \code{"all"} (or \code{TRUE}) to keep all operators, \code{"none"} (or \code{FALSE}) to remove all operators, or \code{"edges"} to keep operators only at both ends of the range.} @@ -7583,6 +7584,17 @@ The interpretation of "I" will be named "Increased exposure" for all EUCAST guid For interpreting MIC values as well as disk diffusion diameters, supported guidelines to be used as input for the \code{guideline} argument are: "EUCAST 2024", "EUCAST 2023", "EUCAST 2022", "EUCAST 2021", "EUCAST 2020", "EUCAST 2019", "EUCAST 2018", "EUCAST 2017", "EUCAST 2016", "EUCAST 2015", "EUCAST 2014", "EUCAST 2013", "EUCAST 2012", "EUCAST 2011", "CLSI 2024", "CLSI 2023", "CLSI 2022", "CLSI 2021", "CLSI 2020", "CLSI 2019", "CLSI 2018", "CLSI 2017", "CLSI 2016", "CLSI 2015", "CLSI 2014", "CLSI 2013", "CLSI 2012", and "CLSI 2011". Simply using \code{"CLSI"} or \code{"EUCAST"} as input will automatically select the latest version of that guideline. +\subsection{Additional \code{ggplot2} Functions}{ + +This package contains several functions that extend the \code{ggplot2} package, to help in visualising AMR data results. All these functions are internally used by \code{\link[=ggplot_sir]{ggplot_sir()}} too. +\itemize{ +\item \code{\link[=facet_sir]{facet_sir()}} creates 2d plots (at default based on S/I/R) using \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}}. +\item \code{\link[=scale_y_percent]{scale_y_percent()}} transforms the y axis to a 0 to 100\% range using \code{\link[ggplot2:scale_continuous]{ggplot2::scale_y_continuous()}}. +\item \code{\link[=scale_sir_colours]{scale_sir_colours()}} sets colours to the bars (green for S, yellow for I, and red for R). Has multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. +\item \code{\link[=theme_sir]{theme_sir()}} is a [ggplot2 theme][\code{\link[ggplot2:theme]{ggplot2::theme()}} with minimal distraction. +\item \code{\link[=labels_sir_count]{labels_sir_count()}} print datalabels on the bars with percentage and number of isolates, using \code{\link[ggplot2:geom_text]{ggplot2::geom_text()}}. +} +} } \examples{ some_mic_values <- random_mic(size = 100) diff --git a/man/ggplot_sir.Rd b/man/ggplot_sir.Rd index 56b805d3..efb99b54 100644 --- a/man/ggplot_sir.Rd +++ b/man/ggplot_sir.Rd @@ -3,11 +3,6 @@ \name{ggplot_sir} \alias{ggplot_sir} \alias{geom_sir} -\alias{facet_sir} -\alias{scale_y_percent} -\alias{scale_sir_colours} -\alias{theme_sir} -\alias{labels_sir_count} \title{AMR Plots with \code{ggplot2}} \usage{ ggplot_sir( @@ -46,28 +41,6 @@ geom_sir( combine_SI = TRUE, ... ) - -facet_sir(facet = c("interpretation", "antibiotic"), nrow = NULL) - -scale_y_percent( - breaks = function(x) seq(0, max(x, na.rm = TRUE), 0.1), - limits = NULL -) - -scale_sir_colours(..., aesthetics = "fill") - -theme_sir() - -labels_sir_count( - position = NULL, - x = "antibiotic", - translate_ab = "name", - minimum = 30, - language = get_AMR_locale(), - combine_SI = TRUE, - datalabels.size = 3, - datalabels.colour = "grey15" -) } \arguments{ \item{data}{a \link{data.frame} with column(s) of class \code{\link{sir}} (see \code{\link[=as.sir]{as.sir()}})} @@ -121,23 +94,20 @@ Use these functions to create bar plots for AMR data analysis. All functions rel } \details{ At default, the names of antibiotics will be shown on the plots using \code{\link[=ab_name]{ab_name()}}. This can be set with the \code{translate_ab} argument. See \code{\link[=count_df]{count_df()}}. -\subsection{The Functions}{ \code{\link[=geom_sir]{geom_sir()}} will take any variable from the data that has an \code{\link{sir}} class (created with \code{\link[=as.sir]{as.sir()}}) using \code{\link[=sir_df]{sir_df()}} and will plot bars with the percentage S, I, and R. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis. -\code{\link[=facet_sir]{facet_sir()}} creates 2d plots (at default based on S/I/R) using \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}}. - -\code{\link[=scale_y_percent]{scale_y_percent()}} transforms the y axis to a 0 to 100\% range using \code{\link[ggplot2:scale_continuous]{ggplot2::scale_y_continuous()}}. - -\code{\link[=scale_sir_colours]{scale_sir_colours()}} sets colours to the bars (green for S, yellow for I, and red for R). with multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. - -\code{\link[=theme_sir]{theme_sir()}} is a [ggplot2 theme][\code{\link[ggplot2:theme]{ggplot2::theme()}} with minimal distraction. - -\code{\link[=labels_sir_count]{labels_sir_count()}} print datalabels on the bars with percentage and amount of isolates using \code{\link[ggplot2:geom_text]{ggplot2::geom_text()}}. +Additional functions include: +\itemize{ +\item \code{\link[=facet_sir]{facet_sir()}} creates 2d plots (at default based on S/I/R) using \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}}. +\item \code{\link[=scale_y_percent]{scale_y_percent()}} transforms the y axis to a 0 to 100\% range using \code{\link[ggplot2:scale_continuous]{ggplot2::scale_y_continuous()}}. +\item \code{\link[=scale_sir_colours]{scale_sir_colours()}} sets colours to the bars (green for S, yellow for I, and red for R). with multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. +\item \code{\link[=theme_sir]{theme_sir()}} is a [ggplot2 theme][\code{\link[ggplot2:theme]{ggplot2::theme()}} with minimal distraction. +\item \code{\link[=labels_sir_count]{labels_sir_count()}} print datalabels on the bars with percentage and amount of isolates using \code{\link[ggplot2:geom_text]{ggplot2::geom_text()}}. +} \code{\link[=ggplot_sir]{ggplot_sir()}} is a wrapper around all above functions that uses data as first input. This makes it possible to use this function after a pipe (\verb{\%>\%}). See \emph{Examples}. } -} \examples{ \donttest{ if (require("ggplot2") && require("dplyr")) { diff --git a/man/plot.Rd b/man/plot.Rd index 29d41628..685b669a 100644 --- a/man/plot.Rd +++ b/man/plot.Rd @@ -15,7 +15,12 @@ \alias{plot.sir} \alias{autoplot.sir} \alias{fortify.sir} -\title{Plotting for Classes \code{sir}, \code{mic} and \code{disk}} +\alias{facet_sir} +\alias{scale_y_percent} +\alias{scale_sir_colours} +\alias{theme_sir} +\alias{labels_sir_count} +\title{Plotting Helpers for AMR Data Analysis} \usage{ scale_x_mic(keep_operators = "edges", mic_range = NULL, drop = FALSE, ...) @@ -113,6 +118,32 @@ scale_fill_mic(keep_operators = "edges", mic_range = NULL, drop = FALSE, ...) ) \method{fortify}{sir}(object, ...) + +facet_sir(facet = c("interpretation", "antibiotic"), nrow = NULL) + +scale_y_percent( + breaks = function(x) seq(0, max(x, na.rm = TRUE), 0.1), + limits = NULL +) + +scale_sir_colours( + ..., + aesthetics = "fill", + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B") +) + +theme_sir() + +labels_sir_count( + position = NULL, + x = "antibiotic", + translate_ab = "name", + minimum = 30, + language = get_AMR_locale(), + combine_SI = TRUE, + datalabels.size = 3, + datalabels.colour = "grey15" +) } \arguments{ \item{keep_operators}{a \link{character} specifying how to handle operators (such as \code{>} and \code{<=}) in the input. Accepts one of three values: \code{"all"} (or \code{TRUE}) to keep all operators, \code{"none"} (or \code{FALSE}) to remove all operators, or \code{"edges"} to keep operators only at both ends of the range.} @@ -161,6 +192,17 @@ The interpretation of "I" will be named "Increased exposure" for all EUCAST guid For interpreting MIC values as well as disk diffusion diameters, supported guidelines to be used as input for the \code{guideline} argument are: "EUCAST 2024", "EUCAST 2023", "EUCAST 2022", "EUCAST 2021", "EUCAST 2020", "EUCAST 2019", "EUCAST 2018", "EUCAST 2017", "EUCAST 2016", "EUCAST 2015", "EUCAST 2014", "EUCAST 2013", "EUCAST 2012", "EUCAST 2011", "CLSI 2024", "CLSI 2023", "CLSI 2022", "CLSI 2021", "CLSI 2020", "CLSI 2019", "CLSI 2018", "CLSI 2017", "CLSI 2016", "CLSI 2015", "CLSI 2014", "CLSI 2013", "CLSI 2012", and "CLSI 2011". Simply using \code{"CLSI"} or \code{"EUCAST"} as input will automatically select the latest version of that guideline. +\subsection{Additional \code{ggplot2} Functions}{ + +This package contains several functions that extend the \code{ggplot2} package, to help in visualising AMR data results. All these functions are internally used by \code{\link[=ggplot_sir]{ggplot_sir()}} too. +\itemize{ +\item \code{\link[=facet_sir]{facet_sir()}} creates 2d plots (at default based on S/I/R) using \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}}. +\item \code{\link[=scale_y_percent]{scale_y_percent()}} transforms the y axis to a 0 to 100\% range using \code{\link[ggplot2:scale_continuous]{ggplot2::scale_y_continuous()}}. +\item \code{\link[=scale_sir_colours]{scale_sir_colours()}} sets colours to the bars (green for S, yellow for I, and red for R). Has multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. +\item \code{\link[=theme_sir]{theme_sir()}} is a [ggplot2 theme][\code{\link[ggplot2:theme]{ggplot2::theme()}} with minimal distraction. +\item \code{\link[=labels_sir_count]{labels_sir_count()}} print datalabels on the bars with percentage and number of isolates, using \code{\link[ggplot2:geom_text]{ggplot2::geom_text()}}. +} +} } \examples{ some_mic_values <- random_mic(size = 100) diff --git a/pkgdown/extra.css b/pkgdown/extra.css index 955cba35..7a68dca6 100644 --- a/pkgdown/extra.css +++ b/pkgdown/extra.css @@ -213,6 +213,11 @@ pre .co, .co { color: var(--amr-green-dark) !important; font-style: italic !important; } +div.sourceCode  pre .co, +div.sourceCode .co { + /* comments in example sections, since functions are already green too */ + color: var(--bs-gray-600) !important; +} pre code .r-out, pre code .r-msg { /* output of functions */