我有一个数据框,用于(简化)评委,电影和评级(评级为1星到5星级):
d = data.frame(judge=c("alice","bob","alice"), movie=c("toy story", "inception", "inception"), rating=c(1,3,5))
我想创建一个条形图,其中x轴是星星的数量,每个条形的高度是该星的评级数。
如果我这样做
ggplot(d, aes(rating)) + geom_bar()
这样可以正常工作,除了条形图不是每个等级的中心,每个条形的宽度都不理想。
如果我这样做
ggplot(d, aes(factor(rating))) + geom_bar()
星数的顺序在x轴上混乱。 (在我的Mac上,至少;出于某种原因,默认排序适用于Windows机器。)这是它的样子:
我试过
ggplot(d, aes(factor(rating, ordered=T, levels=-3:3))) + geom_bar()
但这似乎没有帮助。
如何让我的条形图看起来像上图,但x轴上的顺序正确?
答案 0 :(得分:4)
我不确定您的样本数据框是否代表您提供的图像。您提到您的评分是1-5级,但您的图像显示-3到3的比例。话虽如此,我认为这应该让你朝着正确的方向前进:
示例数据:
d = data.frame(judge=sample(c("alice","bob","tony"), 100, replace = TRUE)
, movie=sample(c("toy story", "inception", "a league of their own"), 100, replace = TRUE)
, rating = sample(1:5, 100, replace = TRUE))
你最接近这个:
ggplot(d, aes(rating)) + geom_bar()
并通过调整geom_bar
中的默认binwidth,我们可以使条形宽度更合适,并将评级作为一个因素将其置于标签的中心位置:
ggplot(d, aes(x = factor(rating))) + geom_bar(binwidth = 1)
如果你想在图表中加入其他变量之一,比如电影,你可以使用填充:
ggplot(d, aes(x = factor(rating), fill = factor(movie))) + geom_bar(binwidth = 1)
如果要比较少量电影,将电影放在x轴上并填写评级可能更有意义:
ggplot(d, aes(x = factor(movie), fill = factor(rating))) + geom_bar(binwidth = 1)
如果这不能帮助您,请提供更具代表性的数据集示例。我无法重新创建排序问题,但这可能是由于您发布的样本数据与您分析的数据不同。
ggplot网站也是一个很好的参考:http://had.co.nz/ggplot2/geom_bar.html