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

时间:2017-12-21 20:42:13

标签: r ggplot2

我尝试使用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

在数学上,我理解为什么会出现这种情况(并且条形图上的对数比例也不是很理想)。但是,我是否有另一种方法可以调整情节(或者我在拍摄情节中的数字)以更接近我试图模仿的情节?

2 个答案:

答案 0 :(得分:3)

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

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

return super(MyModelSerializerCreate, self).create(validated_data)

enter image description here

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

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

对数刻度上的条形图仅在参考点为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_log10(limits = c(1e-100, 15))

enter image description here

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

答案 1 :(得分:3)

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

enter image description here