堆积条形图

机器算法验证 r 数据可视化 条形图
2022-03-19 20:26:03

我有一个数据框,其第一列是项目的名称,第二列是数据集中该项目的频率。

 names            freq
1 tomato           7
2 potato           4
3 cabbage          5
4 sukuma-wiki      8
5 terere           20

我想要一个堆积条柱,描述图表上每个条目的比例。当出现超过 60 个条目时,您如何处理堆叠条的着色?最简单的方法是什么?

3个回答

有 60 个不同的类别,我觉得你可能很难把它做成一个有效的图形。您可能需要考虑按升序或降序排序的常规条形图。这些是计数还是百分比取决于您。也许是这样的:

library(ggplot2)
df$names <- reorder(df$names, -df$freq) #Reorders into ascending order
qplot(x = names, y = freq, data = df, geom = "bar") + coord_flip()

编辑:

要使用 制作堆叠条形图ggplot,我们设置 ,x = 1因为我们将只有一列。我们将使用fill参数来添加颜色:

qplot(x = factor(1), y = freq, data = df, geom = "bar", fill = names) 

同样有趣的是:堆积条形图非常接近饼图。您可以转换 ggplot 图表的坐标系, + coord_polar(theta = "y")以从上面的堆叠条形图制作饼图。

我怀疑您是否会找到具有如此多类别的合适范围的不同颜色。无论如何,这里有一些想法:

  1. 对于堆叠条形图,您需要barplot()使用beside=FALSE(这是默认设置)——这是在基础 R 中(@Chase 的ggplot2解决方案也很好)
  2. 要生成色带,您可以使用RColorBrewer包;@fRed 显示的示例可以使用brewer.pal任何一种发散或顺序调色板进行复制。但是,颜色的数量是有限的,因此您需要回收它们(例如,每 6 件)

这是一个插图:

library(RColorBrewer)
x <- sample(LETTERS[1:20], 100, replace=TRUE)
tab <- as.matrix(table(x))
my.col <- brewer.pal(6, "BrBG") # or brewer.pal(6, "Blues")
barplot(tab, col=my.col)

还有colorspace包,它有一个很好的伴随小插曲,关于良好的配色方案的设计。另请查看 Ross Ihaka 的计算数据分析和图形主题课程。

现在,显示此类数据的更好方法可能是使用所谓的克利夫兰点图,即

dotchart(tab)

对于着色,您可以指定颜色列表或生成它们。

在后者中,我建议您执行此代码

n = 32;
main.name = paste("color palettes; n=",n)
ch.col = c("rainbow(n, start=.7, end=.1)", "heat.colors(n)", "terrain.colors(n)",            "topo.colors(n)", "cm.colors(n)");

nt <- length(ch.col)
i <- 1:n; 
j <- n/nt; 
d <- j/6; 
dy <- 2*d;

plot(i,i+d, type="n", yaxt="n", xaxt="n", ylab="", , xlab ="", main=main.name)   #yaxt="n" set no y axie label and tick.
for (k in 1:nt) {
rect(i-.5, (k-1)*j+ dy, i+.4, k*j, col = eval(parse(text=ch.col[k])), border = "grey");
text(2.5*j, k * j + dy/2, ch.col[k])
}

取自博客http://statisticsr.blogspot.com/2008/07/color-scale-in-r.html

条形图应该用 ?barplot 完成

DF=data.frame(names=c("tomato", "potato", "cabbage", "sukuma-wiki", "terere"), freq=c(7,4,5,8,20))
barplot(as.matrix(DF[,2]), col=heat.colors(length(DF[,2])), legend=DF[,1], xlim=c(0,9), width=2)