2 件事:如何在保留对数刻度的同时将 y 轴值更改为更易于管理的值?如何在盒子上叠加数据的散点图?

2 things: How to change y-axis values to something more manageable whilst retaining log scale? How to overlay a scatter plot of the data over the box?

提问人:Ben 提问时间:7/25/2023 最后编辑:Ben 更新时间:7/25/2023 访问量:36

问:

(请参阅链接中的图片以获得更好的解释)

尝试绘制日志箱线图。我是 R 的新手,并尝试阅读教程,但它们似乎都使用不同的绘图功能?

1/ 我想知道如何在保留对数刻度的同时更改 y 轴值(即更改为 0.001、0.01、0.1、1 等)?

2/ 我还想知道如何在盒子上叠加数据的散点图?

3/ 最后,关于如何添加网格线和边框、所选粗细和颜色以及轴标题的建议会很棒吗?

到目前为止,仅使用的代码是:

boxplot(box,
        varwidth = TRUE, log = "y", las = 1)

对不起,这太明显了,但谢谢大家!

可重现:(前 30 个数据点)

structure(list(CD = c(0.291998350286, 58.4266839332, 1.27227891359, 
7.05106388302, 0.000175203165079, 14.5665189804, 0.991317477169, 
1.56817217741, 30.4733699427, 0.421737157934, 1.42372160368, 
0.333712081068, 0.126643859356, 0.339337851064, 0.151788605996, 
3.81711532569, 1.54344215823, 17.2540240816, 3.67548135199, 4.08331544672, 
0.0549081111653, 0.0734888395127, 5.16751927204, 22.6971132167, 
1.04321972985, 0.184343635879, 2.29291935133, 0.0555342051937, 
0.411328596454, 51.3157360015), WD = c(0.402162969955, 0.189544929529, 
0.000840280055822, 0.0501429051167, 3.4853343866, 0.0286017538011, 
0.0121948073037, 0.992426638872, 0.0192559537415, 0.00398698494632, 
0.888543226817, 0.703331842713, 0.378008558951, 4.70639786908, 
0.113706495683, 1.32546254378, 0.936899368015, 0.108969215053, 
0.25593198462, 0.564518000036, 0.121389166752, 0.195884521759, 
0.704964462359, 1.25602965005, 0.0242662609253, 2.11883481514, 
0.44581781826, 0.659586439033, 0.36869665263, 0.824802234027), 
    MC = c(0.0817800846374, 1.70562818122, 0.0807325401412, 0.180484111266, 
    0.0438908620273, 8.75617400342, 0.479370274286, 0.908307567192, 
    2.81446961622, 0.0699990348088, 0.0491805903311, 0.00573142245572, 
    0.116352754956, 0.311847695137, 0.0414215549125, 0.104499713126, 
    0.0551723673287, 0.076199002014, 0.191940770942, 4.11745930602, 
    1.75751348869, 0.0517694407553, 2.29459310871, 0.0269233884783, 
    0.097992042257, 11.7325079183, 0.262543381616, 0.748125397347, 
    0.635821595694, 0.794256126423), WC = c(0.0686062258206, 
    0.514240129693, 7.68226019254, 4.36776848419, 0.618214352027, 
    2.13911888244, 0.0392505689889, 0.0823059942863, 2.36466448826, 
    0.0688590035687, 0.151457824484, 0.260629997743, 8.30460664472, 
    0.235838508742, 0.41960151168, 4.38818043685, 0.0797918590848, 
    0.109025596179, 0.0837286212892, 0.0117251770506, 1.17739717792, 
    0.207413909376, 8.62180088733, 2.33021344099, 0.166981061366, 
    1.13410263425, 0.0905601584251, 0.154075808752, 0.140498581833, 
    0.213863468391), MWC = c(301.891645135, 0.672405306137, 0.105110378336, 
    5.36947765018, 0.672138277335, 3.58296467263, 10.7754596083, 
    5.01795685162, 0.0775842457366, 1.07683084271, 1.0360624974, 
    16.8763517534, 0.390002867544, 1.50618637339, 0.371973397842, 
    1.28366689573, 0.0633246500391, 0.0364964802158, 0.249895194073, 
    0.0379084221473, 0.0798275709535, 0.504735639066, 8.12262202509, 
    82.5787360252, 0.068574731873, 8.76779568117, 0.00873932360562, 
    0.0142029221366, 0.0228083224849, 0.146073745479)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -30L))
>
R ggplot2 散点图 盒线图 抖动

评论

1赞 neilfws 7/25/2023
欢迎使用 Stack Overflow。如果你通过以纯文本格式包含一个小的代表性数据集来使这个问题可重现,你会得到更好的答案 - 例如,如果不是太大的话,则输出。目前尚不清楚“在保留对数规模的同时更易于管理的东西”是什么意思。使用您需要学习的函数是 、 和 。dput(box)ggplot2geom_boxplot()geom_jitter()labs()theme()
0赞 Ben 7/25/2023
@neilfws感谢您的评论,不胜感激!输入您的建议。“可管理”只是对于不熟悉日志的任何人来说都意味着替代方案。谢谢。很难找到接近如何为绝对初学者使用它们的线程
0赞 neilfws 7/25/2023
感谢您提供的数据:我认为某处缺少括号和几个缺失值,您能否再试一次并仔细复制粘贴输出。dput
1赞 Ben 7/25/2023
@neilfws抱歉,数据集有 000 行长,所以试图手动截图。已经切入 30 行并重新处理了 dput(box) - 希望这次没有错误?

答:

0赞 neilfws 7/25/2023 #1

这里有很多问题,实际上归结为“如何使用 ggplot2”。这是一个很好的介绍性指南

首先,您的数据采用“宽”格式,与“长”格式配合使用效果更好(一列用于数据名称,一列用于其值)。我们可以为此使用。默认情况下,它会生成新列和 .ggplot2tidyr::pivot_longer()namevalue

对于箱线图,我们使用 .我认为您所说的“散点图”是指“抖动图”,这是在箱线图上叠加单个数据点的常用方法。相应的函数是 。geom_boxplot()geom_jitter()

可以通过多种不同的方式更改 y 轴值的标签。一种是使用包中的函数。另一种是提供标签功能 - 请参阅下面的代码。scales

可以使用该函数添加轴标题。labs()

所选粗细和颜色的网格线和边框:嗯,这取决于你到底想要什么,但一般来说,你会使用并寻找与 .在下面的示例代码中,我们添加了一个粗红色边框。theme()panel

因此,将所有这些放在一起:

library(ggplot2)
library(tidyr)
library(dplyr)

box %>% 
  pivot_longer(everything()) %>% 
  ggplot(aes(name, value)) + 
  geom_boxplot(outlier.shape = NA) + 
  geom_jitter(width = 0.2) + 
  scale_y_log10(labels = function(x) format(x, scientific = FALSE)) +     
  theme_bw() + 
  theme(panel.border = element_rect(fill = NA, color = "red", size = 2)) +  
  labs(x = "Group", y = "Value")

结果。希望能帮助您入门。

enter image description here

评论

0赞 Ben 7/25/2023
非常感谢!有一些代码可以使用,这样我就可以复制其他代码,这真是太好了,真的很感激!如果可以的话,还有两个问题:1/是否可以组织抖动,以便按时间顺序排列/例如,按从左到右的出现顺序排列?还是那是不可能的?2/ 我还有一个关于箱形图上等空间平方根 y 尺度的问题;我似乎无法确保 sqrt y 标签的距离相等(如对数图),同时确保数据值更新以对应;你介意看看我目前拥有的代码吗?再次感谢!
0赞 neilfws 7/25/2023
如果你的意思是排序点而不是类别?不,抖动是随机的。目的只是显示数据点的数量及其分布。第二个问题,您可能应该作为新问题发布。
0赞 Ben 7/27/2023
基本上意味着两者兼而有之。在 x 上保留带有 CD WD 等主要类别的箱形图,但对于每个主要类别图,叠加抖动/散射点按时间顺序从左到右,因此保留了时间序列方面 - 从您所说的听起来不可能?问题 2 经过一番摆弄,我以某种方式设法解决了,谢谢!不确定是否值得发布并提供解决方案,以防其他人感兴趣?