条形图制动轴值的对数刻度

时间:2020-04-16 17:56:28

标签: r ggplot2

我正在用ggplot绘制以下条形图:

df  %>% ggplot( aes(x= group,y= cases,fill=color   ) ) + 
  geom_bar(stat="identity") + 
  theme_minimal()

哪个给出以下结果:

enter image description here

问题在于较小的颜色不可见,因此我尝试使用对数刻度:

df  %>% ggplot( aes(x= group,y= cases,fill=color   ) ) + 
  geom_bar(stat="identity") + 
  scale_y_log10(labels = comma) +  
  theme_minimal()

enter image description here

但这完全打破了天平,现在我从任何地方得到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

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()

enter image description here

最后,position='dodge'(或position=position_dodge(width=...))不适用于fill=color,因为df$color不是一个因素(它是数字)。这也是为什么图例显示类别变量的渐变的原因。这就是为什么我在此处的as.factor(color)调用中使用ggplot的原因,尽管您也可以使用df$color <- as.factor(df$color)将其应用于原始数据集并执行相同的操作。