R 条形图制动轴值上的对数比例

R 条形图制动轴值上的对数比例,r,ggplot2,R,Ggplot2,我正在用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")

我正在用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

TL;DR:您不能也不应该使用带有堆叠条形图的对数刻度。如果要使用对数刻度,请改用“减淡”条形图。您还可以在此处使用
geom\u col
而不是
geom\u bar
,并将
fill=
变量设置为一个因子

几何柱与几何柱

尝试使用
geom\u col
代替
geom\u栏
。如果方向不符合您的喜好,您可以使用
coord\u flip()
,但问题的要点是,当您想根据“计数”进行绘图时,应使用
geom_bar
,当您想根据“值”进行绘图时,应使用
geom_col
。在这里,y轴是“cases”(一个值),所以使用
geom\u col

对数刻度和堆叠条形图的问题

尽管如此,这是绝对正确的。您得到的图是有意义的,因为计算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量表:

或者,大约1750万。条形图的总高度仍然是所有单个条形图的总和(因为这就是堆叠条形图),您仍然可以比较相对尺寸,但单个圆木的总和不等于总和的对数:

更改绘图的建议方法

这个故事的寓意是:你仍然可以用原木秤来“伸展”小木条,但不要把它们堆叠起来。使用
position='dodge'

df  %>% ggplot( aes(x= group,y= log10(cases),fill=as.factor(color)   ) ) + 
    geom_col(position='dodge') + 
    theme_minimal()


最后,
position='dodge'
(或
position=position\u dodge(width=…)
)不适用于
fill=color
,因为
df$color
不是一个因子(它是数字)。这也是图例显示分类变量梯度的原因。这就是为什么我在这里调用
ggplot
时使用
as.factor(color)
,尽管当你用对数刻度堆叠条形图时,你也可以用
df$color将其应用到原始数据集,你正在解决这个数学问题:log(a)+log(b)+log(c)=log(abc)因此,你有1000万的价值。我得到了同样的结果。我使用的数据集在最后的问题中。你说得对-记住u/Dave2e的评论,因为这个故事的寓意是不要使用对数刻度和堆叠的条形图:而是使用回避的图。您应该切换到
geom\u col
,还需要将
fill=
美学设置为正确格式的一个因素。请参阅对答案所做的编辑,现在应该已经相当完整了。
>log10(5000 + 153 + 23)
[1] 3.713994
df  %>% ggplot( aes(x= group,y= log10(cases),fill=as.factor(color)   ) ) + 
    geom_col(position='dodge') + 
    theme_minimal()