对数刻度箱线图(如何在 y 轴上保留原始值?)

Vic*_*cky 2 graphics axis r boxplot

我需要一些有关 R 的帮助。我有一个表示为 40 行 12 列矩阵的数据集。我需要这些数据的对数尺度的箱线图。

我使用以下命令:

boxplot(log(data[,2:13]))
Run Code Online (Sandbox Code Playgroud)

我得到了所需的图表,但我希望 Y 轴的值是原始值,即指未转换为日志的数据。我怎么做?

提前致谢!

r2e*_*ans 6

我将从一些示例数据开始:

\n
set.seed(42)\ndata <- data.frame(lapply(setNames(nm=letters[1:4]), function(ign) runif(100, 1, 10)))\nhead(data)\n#          a        b        c        d\n# 1 9.233254 6.636208 8.966059 5.353913\n# 2 9.433679 2.954419 5.653999 5.001126\n# 3 3.575256 2.949106 8.667379 1.543470\n# 4 8.474029 4.500505 4.985166 3.947554\n# 5 6.775710 9.482101 2.420921 8.905861\n# 6 5.671864 9.663472 4.980922 9.375444\n
Run Code Online (Sandbox Code Playgroud)\n

boxplot包含的文档

\n
\n

命名参数是要传递给bxp...的参数和图形参数

\n
\n

虽然不清楚可用的内容,但确实建议您阅读一下bxp,其中包括:

\n
          Currently, \xe2\x80\x98yaxs\xe2\x80\x99 and \xe2\x80\x98ylim\xe2\x80\x99 are used \xe2\x80\x98along the boxplot\xe2\x80\x99,\n          i.e., vertically, when \xe2\x80\x98horizontal\xe2\x80\x99 is false, and \xe2\x80\x98xlim\xe2\x80\x99\n          horizontally.  \xe2\x80\x98xaxt\xe2\x80\x99, \xe2\x80\x98yaxt\xe2\x80\x99, \xe2\x80\x98las\xe2\x80\x99, \xe2\x80\x98cex.axis\xe2\x80\x99, \xe2\x80\x98gap.axis\xe2\x80\x99,\n          and \xe2\x80\x98col.axis\xe2\x80\x99 are passed to axis, and \xe2\x80\x98main\xe2\x80\x99, \xe2\x80\x98cex.main\xe2\x80\x99,\n          \xe2\x80\x98col.main\xe2\x80\x99, \xe2\x80\x98sub\xe2\x80\x99, \xe2\x80\x98cex.sub\xe2\x80\x99, \xe2\x80\x98col.sub\xe2\x80\x99, \xe2\x80\x98xlab\xe2\x80\x99, \xe2\x80\x98ylab\xe2\x80\x99,\n          \xe2\x80\x98cex.lab\xe2\x80\x99, and \xe2\x80\x98col.lab\xe2\x80\x99 are passed to title.\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是,我们无法用它来更多地控制 y 轴,因此我们用来yaxt="n"抑制 y 轴的自动格式化(请参阅?par并阅读有关"xaxt"和 的内容"yaxt")。从那里,我们可以使用axis(...)自己。

\n
          Currently, \xe2\x80\x98yaxs\xe2\x80\x99 and \xe2\x80\x98ylim\xe2\x80\x99 are used \xe2\x80\x98along the boxplot\xe2\x80\x99,\n          i.e., vertically, when \xe2\x80\x98horizontal\xe2\x80\x99 is false, and \xe2\x80\x98xlim\xe2\x80\x99\n          horizontally.  \xe2\x80\x98xaxt\xe2\x80\x99, \xe2\x80\x98yaxt\xe2\x80\x99, \xe2\x80\x98las\xe2\x80\x99, \xe2\x80\x98cex.axis\xe2\x80\x99, \xe2\x80\x98gap.axis\xe2\x80\x99,\n          and \xe2\x80\x98col.axis\xe2\x80\x99 are passed to axis, and \xe2\x80\x98main\xe2\x80\x99, \xe2\x80\x98cex.main\xe2\x80\x99,\n          \xe2\x80\x98col.main\xe2\x80\x99, \xe2\x80\x98sub\xe2\x80\x99, \xe2\x80\x98cex.sub\xe2\x80\x99, \xe2\x80\x98col.sub\xe2\x80\x99, \xe2\x80\x98xlab\xe2\x80\x99, \xe2\x80\x98ylab\xe2\x80\x99,\n          \xe2\x80\x98cex.lab\xe2\x80\x99, and \xe2\x80\x98col.lab\xe2\x80\x99 are passed to title.\n
Run Code Online (Sandbox Code Playgroud)\n

带有未记录的 y 轴标签的基本图

\n

有人可能会说小数轴刻度并不理想,我们还可以引入axisTicks

\n
boxplot(log(data[,2:4]), yaxt = "n")\naxis(2, at = axTicks(2), labels = round(exp(axTicks(2)), 2), las = 1)\n
Run Code Online (Sandbox Code Playgroud)\n

基本图、对数轴、更好的标签

\n
\n

顺便说一句,人们也可以使用ggplot2,尽管它与基本图形有很大不同。首先,它确实受益于“长”数据,即从“宽”形式data变为

\n
boxplot(log(data[,2:4]), yaxt = "n")\nax <- axisTicks(exp(par("usr")[3:4]), log = FALSE)\naxis(2, at = log(ax), labels = ax, las = 1)\n
Run Code Online (Sandbox Code Playgroud)\n

为此,我们可以找点乐子:

\n
datalong <- reshape2::melt(data, id.vars=c())\nhead(datalong,3); tail(datalong,3)\n#   variable    value\n# 1        a 9.233254\n# 2        a 9.433679\n# 3        a 3.575256\n#     variable    value\n# 398        d 9.162482\n# 399        d 5.961255\n# 400        d 1.680392\n
Run Code Online (Sandbox Code Playgroud)\n

ggplot 箱线图

\n

(哎呀,我没有继续省略第一列的示例......这实际上只对尝试与原始代码保持一致有用。仅供参考,如果您在此reshape2::melt操作中想要/需要帮助,我建议您访问将 data.frame 从宽格式重塑为长格式将宽数据转换为具有多个变量的长格式。有无数的参考资料、Q/As 和其他地方可以学习ggplot2;我经常使用https://r-graph-gallery.com以获得好的例子。)

\n