ggplot分组条形图上的对数比例问题

问题描述 投票:4回答:2

我正在尝试使用R中的ggplot2制作具有对数刻度的分组条形图。我的目标是在R中重新创建以下绘图。

enter image description here

因为生成它的程序无法制作高分辨率图形。我需要一个对数刻度,因为数字范围从1到超过1000,并且介于两者之间。

这是数据帧简化版的片段,以及我一直在使用的代码。我已经能够使用ggplot2创建绘图,但我的问题是我在数据中有很多1,最终被绘制为0,而0显示为-1。这是我的R情节的样子。

genus_counts <- read.table(text = "Genus variable value
1  Lepisosteus  JBGC462     0
2      Lepomis  JBGC462     6
3  Micropterus  JBGC462     2
4        Perca  JBGC462     2
5    Ictalurus  JBGC462     1
6  Lepisosteus   JBGC13    13
7      Lepomis   JBGC13     0
8  Micropterus   JBGC13     0
9        Perca   JBGC13     0
10   Ictalurus   JBGC13     0", header = TRUE)


ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+
      geom_bar(stat="identity", position="dodge")+
      scale_y_log10()

enter image description here

在数学上,我理解为什么会这样(并且条形图上的对数比例也不是很理想)。但是,还有另一种方法可以调整情节(或者我正在绘制的情节中的数字)以更接近我想要模仿的情节吗?

r ggplot2
2个回答
3
投票

如果你使用scale_y_sqrt(),它看起来像这样,这似乎是你的示例情节的一个非常好的匹配。我添加了一个值为1000的行,以说明您可以看到像1和2这样的小值,以及大值。

enter image description here


3
投票

您遇到的问题基本上与以下事实相关:具有正计数的条形或具有0计数的条形无限长。

查看更改y轴的轴范围时会发生什么:

genus_counts <- read.table(text = "Genus variable value
1  Lepisosteus  JBGC462     0
2      Lepomis  JBGC462     6
3  Micropterus  JBGC462     2
4        Perca  JBGC462     2
5    Ictalurus  JBGC462     1
6  Lepisosteus   JBGC13    13
7      Lepomis   JBGC13     0
8  Micropterus   JBGC13     0
9        Perca   JBGC13     0
10   Ictalurus   JBGC13     0", header = TRUE)


ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+
  geom_bar(stat="identity", position="dodge")+
  scale_y_log10(limits = c(0.1, 15))

enter image description here

在这种情况下,酒吧走向负面很长一段路。但是等等,我们可以走得更远:

ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+
  geom_bar(stat="identity", position="dodge")+
  scale_y_log10(limits = c(1e-100, 15))

enter image description here

仅当参考点为1时,对数刻度上的条形图才有意义,这样您就可以看到相对于1的值的变化,数字<1显示为向下的条形。 ggplot2正确处理这个问题。如果您尝试将参考点设为0,则所有条形将无限长,并且您无法选择合适的轴范围。

请注意,您作为示例显示的图表是错误的,因为它在y轴上的位置1处放置了0。值0在该图上不可见,并且所有条的长度都具有误导性。

最后,有人提到了平方根比例。它避免了无限长条的问题:

ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+
  geom_bar(stat="identity", position="dodge")+
  scale_y_sqrt(limits = c(0, 15), breaks = (0:4)^2)

enter image description here

我也不是这个解决方案的忠实粉丝,因为条形长度令人困惑。请注意对应于值6的条形仅为对应于值1的条形的2.5倍。我们的大脑误解了这些条形和锁定条形的相对长度,而不是y的数字。轴。

© www.soinside.com 2019 - 2024. All rights reserved.