我尝试使用R中的ggplot2制作一个对数刻度的分组条形图。我的目标是在R中重新创建以下图。
因为生成它的程序无法生成高分辨率图形。我需要一个对数刻度,因为数字范围从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()
在数学上,我理解为什么会出现这种情况(并且条形图上的对数比例也不是很理想)。但是,我是否有另一种方法可以调整情节(或者我在拍摄情节中的数字)以更接近我试图模仿的情节?
答案 0 :(得分:3)
您遇到的问题基本上与以下事实有关:具有正计数的条形或具有0计数的条形无限长。
查看更改y轴的轴范围时会发生什么:
return super(MyModelSerializerCreate, self).create(validated_data)
在这种情况下,酒吧走向负面很长一段路。但是等等,我们可以走得更远:
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))
对数刻度上的条形图仅在参考点为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))
我也不是这个解决方案的忠实粉丝,因为条形长度令人困惑。请注意对应于值6的条形仅为对应于值1的条形的2.5倍。我们的大脑误解了这些条形和锁定条形的相对长度,而不是y的数字。轴。
答案 1 :(得分:3)