使用ggplot在R中的100%堆积柱形图中创build一个logging轴

我有百分比的数据。 我想用ggplot来创build一个图表,但是我不能像我想的那样工作。 由于数据非常偏斜,所以简单的堆积柱不能很好地工作,因为真正的小数值不会显示出来。 这里是一个样本集:

Actual Predicted a 0.5 5 b 9.5 5 c 90 90 

左边是excel图,右边是R-ggplot

高强Rplot

问题是,在R列不堆叠起来,甚至。

这是我的R代码:

 a = c("a","b","c","a","b","c") b = c("Actual","Actual","Actual","Predicted","Predicted","Predicted") c = c(0.5,2.5,97,0.2,2.2,97.6) c = c+1 dat = data.frame(Type=a, Case=b, Percentage=c) ggplot(dat, aes(x=Case, y=Percentage, fill=Type)) + geom_bar(stat="identity") + scale_y_log10() 

*在Excel和RI都做一个+1来处理数字0-1,所以y轴稍微偏离

如果我使用:

 ggplot(dat, aes(x=Case, y=Percentage, fill=Type)) + geom_bar(stat="identity",position = "fill") + scale_y_log10() 

总高度匹配,但是两个蓝色部分的大小不匹配(它们都是90%)

在这里输入图像说明

只是因为两组数字加起来相同的值(在这种情况下为103)并不意味着日志总和将加起来相同的值! 当你没有“填充”堆叠酒吧,你会得到他们不同的高度,因为这些值的日志总和是不同的。 当你把它们全部缩放到相同的高度时,你必须用不同的速率压扁蓝色盒子,所以它们看起来不一样。

Excel条形图故意误导。 左边的红色条与上面的蓝色条大小相同,但代表蓝色条约十分之一的值。 你不能在一个比例的对数比例的条形图 – 它只是错误的。

有一个很好的方式来显示小数字,而不会丢失或歪曲他们。 它是一种惊人的可视化技术,被称为“在一张桌子上写数字”。

我设法让它像excel一样工作。 像Spacedman说,情节是视觉上误导,但在数字上是正确的。 原因是我们想比较小节段的实际高度,在数值上你需要查看y轴的开始和结束值。 它类似于没有y轴最小值为零的条形图。 这是一个例子 。

我不确定我是否会使用该方法来显示数据,但我必须弄清楚。

结果如下:

在这里输入图像说明

这里是代码(我可以把它作为一个函数来清理,当你在ggplot中赋值时,可以调用它)。

 a = c("a","b","c","a","b","c") b = c("Actual","Actual","Actual","Predicted","Predicted","Predicted") c = c(0.5,9.5,90,5,5,90) c = c+1 dat = data.frame(Type=a, Case=b, Percentage=c, Cumsum_L=c, Cumsum=c, Norm=c) for(i in 1:length(dat$Percentage)){ cumsum=0 for(j in 1:i){ if(dat$Case[j]==dat$Case[i]){ cumsum=cumsum+(dat$Percentage[j]) } } dat$Cumsum_L[i]=cumsum-dat$Percentage[i] dat$Cumsum[i]=cumsum if(dat$Cumsum_L[i]==0){ dat$Cumsum_L[i]=1 } dat$Norm[i] = log(dat$Cumsum[i])-log(dat$Cumsum_L[i]) } intervals = seq(from = 0, to = 100, by = 10) intervals_log = log(intervals) intervals_log[1]=0 ggplot(dat, aes(x=Case, y=Norm, fill=Type)) + geom_bar(stat="identity") + scale_y_continuous(name="Percent",breaks = intervals_log, labels=intervals ) 

*我还需要修复终点+1有点事情。

**我也可能是屠杀math。