重新排列 X 轴的顺序会导致误差条在 y 轴上不再匹配

Posted

技术标签:

【中文标题】重新排列 X 轴的顺序会导致误差条在 y 轴上不再匹配【英文标题】:Rearranging order of X axis causes errorbars to no longer match up on y axis 【发布时间】:2021-11-19 09:41:21 【问题描述】:

我想订购我的 y 轴值,这样做我的误差条不再适合 y 轴。代码如下,如果我只运行ggplot,我会在正确的位置得到错误栏,如果我运行它,从ggplot 中删除Kale_Nutrients,错误栏会在Y 轴上移位。

Kale_Nutrients %>%
  arrange(X) %>%
  mutate(X = factor(X, levels=c( "Control", "B1 <2mm 5%", "B1 <2mm 10%", 
            "B1 <2mm 20%", "B1 >2mm 5%", "B1 >2mm 10%", 
            "B1 >2mm 20%", "B2 <2mm 5%", "B2 <2mm 10%","B2 <2mm 20%", "B2 >2mm 5%", "B2 >2mm 10%", "B2 >2mm 20%", "B3 <2mm 5%", "B3 <2mm 10%", "B3 <2mm 20%", "B3 >2mm 5%", "B3 >2mm 10%", "B3 >2mm 20%"))) %>%
ggplot(Kale_Nutrients,aes(X, P))+
geom_point()+
theme_classic()+
theme(axis.text.x=element_text(angle=90, size=12, color="black"),panel.grid.major = element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(),axis.line = element_line(colour = "black"),axis.text.y=element_text( size=14, color="black"),axis.title=element_text(size=14, face="bold"))+
geom_errorbar(ymin=Kale_Nutrients$P-Kale_Nutrients$P.s.e , ymax=Kale_Nutrients$P+Kale_Nutrients$P.s.e)+
ylim(0,4000)

Running without reordering the x axis

Running after reordering the x axis with the errorbars displaced on the y axis

【问题讨论】:

我不明白为什么你在管道之后使用ggplot(Kale_Nutrients, aes...) 而不是仅仅ggplot(aes...) 这是管道系统的重点,或者为什么你又指定Kale_Nutrients$... 即使它已经是您的绘图活动数据。只需让 ggplot 从管道中获取数据,并删除 Kale_Nutrients$ 位,这样一切都将始终基于处理后的 data.frame。 我在问题中指定了我在第二次运行时删除了 Kale_Nutrients 并进行了修改以重新排列 x 轴。不过谢谢 我看到了,但发现您删除的内容模棱两可,因为代码中有多个地方出现了名称。仅从基本 ggplot 调用而不是 errorbars 调用中删除名称,显然会导致重新排序和未重新排序数据的不匹配混合。无论如何,您没有提供(一块)Kale_Nutrients 来尝试代码,因此基于原则的猜测是我唯一能做的事情。您可能会发现本指南对以后的帖子很有用,尤其是关于易于重现的示例的部分:***.com/help/how-to-ask快乐编码! 抱歉,您发现它含糊不清。这对我来说并不明显,因此我问了这个问题。我才刚刚开始学习这一切,所以对你来说显而易见的东西对那些提出问题的人来说并不明显,或者他们不会问。我将研究易于重现的示例,也许创建虚拟数据将是解决方案,因为我不愿意分享我的任何研究数据 当然,虚拟数据很好,实际上通常甚至比真实数据更好。你是对的,不可能知道这个人知道或不知道什么,我们做出猜测并希望我们不要严重高估或低估。你对 cme​​ts 的信心让我觉得我一开始可能低估了你的知识。顺便说一句,为了我的安心,我的解决方案是否正常工作?你给我留下的印象是事实并非如此,这意味着我的理解存在重大差距,我需要研究一下。 【参考方案1】:

您需要从具有重新排序的因子水平的数据集中提取误差线的值,而不是原始的Kale_Nutrients 数据框。这会将错误栏的代码更改为:

geom_errorbar(aes(ymin=P-P.s.e , ymax=P+P.s.e))+

【讨论】:

谢谢你的工作。就知道会是那样的愚蠢。【参考方案2】:

Miff 回答如下,并且有效。

您需要从具有重新排序的因子水平的数据集中提取误差线的值,而不是原始 Kale_Nutrients 数据框。这会将错误栏的代码更改为:

geom_errorbar(aes(ymin=P-P.s.e , ymax=P+P.s.e))+

【讨论】:

有一种机制可以将回复标记为已接受的解决方案,而不是复制粘贴您喜欢的答案。 啊,我没意识到,谢谢【参考方案3】:

我认为问题是基于对管道机制的误解/误用:

通过指定ggplot(Kale_Nutrients, ...),您是在告诉 ggplot 使用原始数据框,而不是您通过管道传输的重新排序的数据框(管道创建一个新对象,除非明确分配,否则它们不会修改原始对象)。在这种情况下,它没有区别,因为您没有对点值应用过滤器或修改,但在另一种情况下,它可能会导致您绘制错误/旧点值。

此外,由于列与您的点数据存在于同一数据框中,因此无需在错误栏的美学中指定数据框名称。

我相信以下内容将满足您的需求,同时解决您看到的问题和您没有看到的问题,但如果您进行更多修改而不是重新排序因素,则会出现问题:

Kale_Nutrients %>%
  arrange(X) %>%
  mutate(X = factor(X, levels=c( "Control", "B1 <2mm 5%", "B1 <2mm 10%", 
            "B1 <2mm 20%", "B1 >2mm 5%", "B1 >2mm 10%", 
            "B1 >2mm 20%", "B2 <2mm 5%", "B2 <2mm 10%","B2 <2mm 20%", "B2 >2mm 5%", "B2 >2mm 10%", "B2 >2mm 20%", "B3 <2mm 5%", "B3 <2mm 10%", "B3 <2mm 20%", "B3 >2mm 5%", "B3 >2mm 10%", "B3 >2mm 20%"))) %>%
ggplot(aes(X, P))+
geom_point()+
theme_classic()+
theme(axis.text.x=element_text(angle=90, size=12, color="black"),panel.grid.major = element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(),axis.line = element_line(colour = "black"),axis.text.y=element_text( size=14, color="black"),axis.title=element_text(size=14, face="bold"))+
geom_errorbar(ymin=P-P.s.e , ymax=P+P.s.e)+
ylim(0,4000)

【讨论】:

我很欣赏这一点,但是我在文本中指定我从 ggplot 中删除了 Kale_Nutrients。 Miff 已经回答了这个问题。 当我开始打字时,没有任何反应。当我发布后刷新时,有多个。事情就是这样运作的。

以上是关于重新排列 X 轴的顺序会导致误差条在 y 轴上不再匹配的主要内容,如果未能解决你的问题,请参考以下文章

怎样修改echarts X和Y轴的颜色

按频率/值排序离散 x 比例

highchart - scatter : 设置 x 轴和 y 轴的小数

更改 x 轴的刻度标签

朴素贝叶斯和 SVM 分类 - 如何在 x y 轴上绘制精度?

如何在origin9中做双y轴的柱状图