我正在使用库ggplot2movies
来存储数据movies
请记住,我指的是mpaa评分和用户评分,这是两件事。如果您不想加载ggplot2movies
库,请参考以下相关数据示例:
> head(subset(movies[,c(5,17)], movies$mpaa!=""))
# A tibble: 6 x 2
rating mpaa
<dbl> <chr>
1 5.3 R
2 7.1 PG-13
3 7.2 PG-13
4 4.9 R
5 4.8 PG-13
6 6.7 PG-13
在这里我制作一个条形图来显示具有mpaa等级的电影的频率:
ggplot(data=subset(movies, movies$mpaa!=""), aes(mpaa)) +
geom_bar()
现在,我想根据imdb用户的评分为条形填充颜色。我不想使用factor(rating)
,因为“评级”列中包含大量不同的值。但是,当我尝试使用Assigning continuous fill color to geom_bar之类的连续填充时,会得到相同的图形。
ggplot(data=subset(movies, movies$mpaa!=""), aes(mpaa, fill=rating)) +
geom_bar()+
scale_fill_continuous(low="blue", high="red")
我认为这与以下事实有关:我的条形图基于单个变量的频率,而不是基于具有count列的数据框。我可以制作一个新的mpaa类别及其计数的数据框,但是我更想知道如何使用原始movies
数据集和一个ggplot来制作此图。
编辑:使用aes(mpaa, group = rating, fill = rating)
给出的图表几乎正确,只是条形图和图例被交换了。
答案 0 :(得分:2)
您可以使用+ guides(fill=guide_colourbar(reverse=TRUE))
来反转图例,但是,颜色渐变似乎并不能提供很多信息。另一个选择是将rating
切成离散范围,如下面的示例所示,它可以更清楚地指示每个mpaa
类别中的评分分布。不过,由于钢筋高度不同,因此尚不清楚mpaa
类别的平均评分或评分分布如何变化。
library(tidyverse)
library(ggplot2movies)
theme_set(theme_classic())
movies %>%
filter(mpaa != "") %>%
mutate(rating = fct_rev(cut(rating, seq(0,ceiling(max(rating)),2)))) %>%
ggplot(aes(mpaa, fill=rating)) +
geom_bar(colour="white", size=0.2) +
scale_fill_manual(values=c(hcl(240,100,c(30,70)), "yellow", hcl(0,100,c(70,30))))
也许箱形图或小提琴图会提供更多信息。在下面的箱线图示例中,由于varwidth=TRUE
参数的存在,箱形宽度与额定电影数量的平方根成正比(我对此并不陌生,因为平方根变换难以解释,但我认为我可以将其作为一种选择)。在小提琴图中,每个小提琴的面积与每个mpaa
类别中的电影数量成比例(由于scale="count"
自变量)。我还在x轴标签中放置了每个类别中的电影数量,并以蓝色标记了每个mpaa
类别的平均评分。
p = movies %>%
filter(mpaa != "") %>%
group_by(mpaa) %>%
mutate(xlab = paste0(mpaa, "\n(", format(n(), big.mark=","), ")")) %>%
ggplot(aes(xlab, rating)) +
labs(x="MPAA Rating\n(number of movies)",
y="Viewer Rating") +
scale_y_continuous(limits=c(0,10))
pl = list(geom_boxplot(varwidth=TRUE, colour="grey70"),
geom_violin(colour="grey70", scale="count",
draw_quantiles=c(0.25,0.5,0.75)),
stat_summary(fun.y=mean, geom="text", aes(label=sprintf("%1.1f", ..y..)),
colour="blue", size=3.5))
gridExtra::grid.arrange(p + pl[-2], p + pl[-1], ncol=2)
答案 1 :(得分:0)