我有一个数据框,其第一列是项目的名称,第二列是数据集中该项目的频率。
names freq
1 tomato 7
2 potato 4
3 cabbage 5
4 sukuma-wiki 8
5 terere 20
我想要一个堆积条柱,描述图表上每个条目的比例。当出现超过 60 个条目时,您如何处理堆叠条的着色?最简单的方法是什么?
我有一个数据框,其第一列是项目的名称,第二列是数据集中该项目的频率。
names freq
1 tomato 7
2 potato 4
3 cabbage 5
4 sukuma-wiki 8
5 terere 20
我想要一个堆积条柱,描述图表上每个条目的比例。当出现超过 60 个条目时,您如何处理堆叠条的着色?最简单的方法是什么?
有 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")
以从上面的堆叠条形图制作饼图。
我怀疑您是否会找到具有如此多类别的合适范围的不同颜色。无论如何,这里有一些想法:
barplot()
使用beside=FALSE
(这是默认设置)——这是在基础 R 中(@Chase 的ggplot2解决方案也很好)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)