首页 > 解决方案 > 如何在不反转绘图的情况下切换 ggplot 中的 y 轴标签?

问题描述

我正在尝试绘制物种的平均值,尽管平均值都是负数。我希望更小的值(更负)靠近 y 轴的底部,而更大的值(更小的负)在 y 轴上更高。

我试过改变coord_cartesianylim但都没有工作。

ggplot(meanWUE, aes(x = Species, y = mean, fill = Species)) + 
 coord_cartesian(ylim = c(-0.8, -0.7)) +
 scale_fill_manual( values c("EUCCHR" = "darkolivegreen2","ESCCAL" = "darkgoldenrod2", "ARTCAL" = "darkcyan", "DEIFAS" = "darkred", "ENCCAL" = "darkorchid2", "SALMEL" = "deepskyblue1", "ERIFAS" = "blue3", "BRANIG" = "azure3", "PHAPAR"= "palevioletred" )) + 
 scale_y_reverse() + 
 geom_bar(position = position_dodge(), stat="identity") +
 geom_errorbar(aes(ymin=mean-se, ymax=mean+se),width=.3) +
 labs(x="Species", y="WUE")+ 
 theme_bw() + 
 theme(panel.grid.major = element_blank(), legend.position = "none")

我希望 ESCCAL 和 EUCCHR 本质上是最短的条,但目前它们被显示为最高的。

物种与用水效率

在此处输入图像描述

如果我不做 scale_y_reverse,我会得到一个看起来像第二张图像的图

标签: r

解决方案


一种方法是移动所有数字以显示它们在基线上的值,然后以相同的方式调整标签:

df <- data.frame(Species = LETTERS[1:10],
                 mean = -80:-71/100)

ggplot(df, aes(x = Species, y = mean, fill = Species)) + 
  geom_bar(position = position_dodge(), stat="identity")

在此处输入图像描述

在这里,我们移动值以根据新基线显示它们。然后我们可以将更大的数字显示为更大的条形,就像我们通常期望的正数一样。同时,我们更改 y 轴上的标签,使其与原始值相对应。所以 -0.8 变为 +0.1,而基线为 -0.9。但是我们也调整了标签,因此调整后的 0 的标签为 -0.9,调整后的 +0.1 的标签为 -0.8,即其原始值。

baseline <- -0.9
ggplot(df, aes(x = Species, y = mean - baseline, fill = Species)) + 
  geom_bar(position = position_dodge(), stat="identity") +
  scale_y_continuous(breaks = 0:100*0.02,
                     labels = 0:100*0.02 + baseline, minor_breaks = NULL)

在此处输入图像描述


推荐阅读