我正在尝试使用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计数的条形无限长。
查看更改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))
在这种情况下,酒吧走向负面很长一段路。但是等等,我们可以走得更远:
ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+
geom_bar(stat="identity", position="dodge")+
scale_y_log10(limits = c(1e-100, 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_sqrt(limits = c(0, 15), breaks = (0:4)^2)
我也不是这个解决方案的忠实粉丝,因为条形长度令人困惑。请注意对应于值6的条形仅为对应于值1的条形的2.5倍。我们的大脑误解了这些条形和锁定条形的相对长度,而不是y的数字。轴。