我正在用ggplot绘制以下条形图:
df %>% ggplot( aes(x= group,y= cases,fill=color ) ) +
geom_bar(stat="identity") +
theme_minimal()
哪个给出以下结果:
问题在于较小的颜色不可见,因此我尝试使用对数刻度:
df %>% ggplot( aes(x= group,y= cases,fill=color ) ) +
geom_bar(stat="identity") +
scale_y_log10(labels = comma) +
theme_minimal()
但这完全打破了天平,现在我从任何地方得到10毫米的值,而条形尺寸是错误的
我为此使用的数据如下:
index,group,color,cases
1,4,4,9
2,4,3,61
3,1,1,5000
4,4,2,138
5,4,1,246
6,3,1,359
7,2,1,2000
8,3,2,57
9,1,2,153
10,2,2,130
11,2,3,15
12,1,3,23
13,3,3,11
14,2,4,1
答案 0 :(得分:1)
TL; DR:您不能也不应使用带有堆积条形图的对数刻度。如果要使用对数刻度,请改用“躲避”条形图。此外,您还可以在这里使用geom_col
而不是geom_bar
,并将fill=
变量设置为一个因素。
Geom_col与geom_bar
尝试使用geom_col
代替geom_bar
。如果您的指示不符合您的喜好,则可以使用coord_flip()
。 See here for reference,但是问题的要点是,当您要针对“计数”进行绘图时,应使用geom_bar
,而当您要针对“值”进行绘图时,应使用geom_col
。在这里,您的y轴是“ cases”(一个值),因此请使用geom_col
。
对数刻度和堆积条形图的问题
话虽如此,u/Dave2e绝对正确。您得到的图很有意义,因为完成了计算y轴值的基础数学是:log10(x) + log10(y) + log10(z)
,而不是您所期望的log10(x + y + z)
。
让我们在此处使用实际数据框中的数字进行比较。在“组1”中,您具有以下内容:
index group color cases
3 1 1 5000
9 1 2 153
12 1 3 23
因此,在y轴上发生的是堆积条形图的总值(无对数标度)将为所有值的总和。换句话说:
> 5000 + 153 + 23
[1] 5176
这意味着每个条形都代表正确的相对大小,并且将它们相加(或堆叠 )时,条形的总大小等于总和。有道理。
现在考虑相同的情况,但对于 log10量表:
> log10(5000) + log10(153) + log10(23)
[1] 7.245389
或者,大约只有1750万。条形图的总高度仍然是所有单个条形图的总和(因为这就是堆积的条形图),您仍然可以比较相对尺寸,但是单个条形图的总和不等于总和:
>log10(5000 + 153 + 23)
[1] 3.713994
更改情节的建议方法
故事的寓意:您仍然可以使用对数刻度来“伸出”小条,但不要堆叠它们。使用postion='dodge'
:
df %>% ggplot( aes(x= group,y= log10(cases),fill=as.factor(color) ) ) +
geom_col(position='dodge') +
theme_minimal()
最后,position='dodge'
(或position=position_dodge(width=...)
)不适用于fill=color
,因为df$color
不是一个因素(它是数字)。这也是为什么图例显示类别变量的渐变的原因。这就是为什么我在此处的as.factor(color)
调用中使用ggplot
的原因,尽管您也可以使用df$color <- as.factor(df$color)
将其应用于原始数据集并执行相同的操作。