柱状图(ggplot2)中y轴显示对数刻度并且有断点

3

我有这个图表

enter image description here

代码:

library("tidyverse")
library("scales")
#data
> dput(Vesself[1:50,])
structure(list(AREA = c("A10", "A13", "A16", "A2", "A23", "A25", 
"A25", "A26", "A26", "A26", "A27", "A28", "A28", "A36", "A39", 
"A43", "B25", "B25", "B26", "B26", "B30", "B30", "B41", "B43", 
"B44", "C27", "C36", "C7", "D15", "D19", "D24", "D29", "D29", 
"D38", "D51", "E15", "E17", "E18", "E18", "E19", "E19", "E19", 
"E19", "E20", "E27", "E27", "E27", "E28", "E28", "E28"), VESSELm = structure(c(5L, 
5L, 5L, 5L, 5L, 3L, 5L, 5L, 3L, 2L, 5L, 3L, 5L, 3L, 5L, 5L, 5L, 
3L, 3L, 5L, 2L, 5L, 5L, 5L, 5L, 5L, 3L, 5L, 3L, 3L, 3L, 3L, 5L, 
3L, 2L, 5L, 3L, 5L, 3L, 1L, 2L, 5L, 3L, 5L, 3L, 2L, 5L, 2L, 3L, 
5L), .Label = c("1", "2", "3", "4", "5"), class = "factor"), 
VESSEL = c(1, 1, 1, 2, 1, 2, 5, 5, 2, 1, 1, 1, 6, 1, 1, 5, 
1, 1, 1, 2, 1, 2, 1, 1, 6, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 
1, 6, 1, 3, 1, 1, 1, 1, 1, 5, 1, 22, 2, 1, 8), Clust = structure(c(4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 2L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 2L, 4L, 4L, 4L, 4L, 2L, 2L, 
4L, 4L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L), .Label = c("1", "2", "3", "4"), class = "factor")), row.names = c(NA, 
50L), class = "data.frame")

my_breaksx = c(1, 4, 16, 64, 256, 660)

#Plot

ggHist <- ggplot(data = Vesself, aes(VESSEL, color = Clust, fill = Clust)) + geom_bar(stat = "count", width = 0.08) + scale_color_manual(values = cols, name = "Group") + scale_fill_manual(values = cols, name = "Group") +
  scale_x_continuous(trans = log2_trans(), breaks = my_breaksx) +
  labs(x="Density of ships per area", y="Number of area", title="Distribution of ship density", subtitle="by scales")+
  theme_bw() +
  theme(plot.title = element_text(face="bold", hjust=0.5), plot.subtitle=element_text(hjust=0.5), legend.background = element_rect(fill="grey90", size=0.5, linetype="solid", colour ="black"), aspect.ratio = 1) + 
  facet_wrap(~VESSELm)
ggHist

当我尝试对y轴应用对数变换时,与x轴不同,值非常高。我不明白为什么会这样。
没有手动断点的转换结果:
scale_y_continuous(trans = log2_trans())

enter image description here

并且手动换行的结果为:

my_breaksy = c(1, 4, 16, 64, 150)

scale_y_continuous(trans = log2_trans(), breaks = my_breaksy)

enter image description here

我的目标是拥有与x轴等效的表示。


1
尝试用"log2"替换log2_trans()函数的调用。 - bob1
5
作为一个旁注,对于堆叠条形图来说,对数变换会导致误解并且很难解释。如果两个高度相等的堆叠条形图段被显示为相等的高度,或者顶部的段应该是下面一段的一半大小,这将是令人困惑的。我建议您切换到闪避位置,或找出一种避免在对数刻度上显示“组成”的方法。 - Jon Spring
1
没有提供可复现的数据集,很难进行故障排除。 - Anonymous coward
当我用"log2"替换"log2_trans()"时,它不起作用。@bob1 我扩展了示例的行数(n = 50)。@Anonymouscoward - C. Guff
可以尝试使用 dput(vesself[1:50,]) 这样的代码,以R可读格式获取前50行数据,这样可以为其他人节省一些工作量。这是可重复性示例的一部分,人们经常谈论它... - bob1
现在,可重现的示例以R可读格式呈现(来自函数dput(vesself[1:50,]))。 - C. Guff
1个回答

1

我回顾了问题,并通过旧答案找到了解决方案。

主要问题是,当我在geom_bar(stat = "count")上使用对数变换时,例如以下代码:

scale_y_continuous(trans = log2_trans(),
    breaks = trans_breaks("log2", function(x) 2^x),
    labels = trans_format("log2", math_format(2^.x)))

我在y轴上达到了过高的值(1073741828而不是1000)。

enter image description here

我使用的解决方案是在绘图之前对计数进行转换,并应用输出的变换,然后使用geom_bar(stat = "identity")进行绘图。
DF <- ddply(Vesself, .(VESSEL, VESSELm, Clust), summarise, n=length(Clust))
DF$log2n <- log2(DF$n)
my_breaksy = c(1, 4, 10, 16, 22, 27, 32)
#Plot
ggHist <- ggplot(data = DF, aes(x = VESSEL, y =log2n, color = Clust, fill = Clust)) + geom_bar(stat = "identity", width = 0.08) + scale_color_manual(values = cols, name = "Group") + scale_fill_manual(values = cols, name = "Group") +
  scale_x_continuous(trans = log2_trans(), breaks = my_breaksx) +
  scale_y_continuous(breaks = my_breaksy, label = my_breaksy^2) + 
  labs(x="Density of ships per area", y="Number of area", title="Distribution of ship density", subtitle="by scales")+
  theme_bw() +
  theme(plot.title = element_text(face="bold", hjust=0.5), plot.subtitle=element_text(hjust=0.5), legend.background = element_rect(fill="grey90", size=0.5, linetype="solid", colour ="black"), aspect.ratio = 1) + 
  facet_wrap(~VESSELm)
ggHist

这段代码产生了预期的结果

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接