如何使用一个变量连续填充ggplot2条形图

时间:2018-12-02 16:02:24

标签: r ggplot2

我正在使用库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()

enter image description here

现在,我想根据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)给出的图表几乎正确,只是条形图和图例被交换了。 enter image description here

2 个答案:

答案 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))))

enter image description here

也许箱形图或小提琴图会提供更多信息。在下面的箱线图示例中,由于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)

enter image description here

答案 1 :(得分:0)

我不确定您想要的是什么。
当用manejoCuentas(cuentas, clientes, opcion); 着色时,默认的rating不起作用,因此我转换了数据。

stat = "count"

enter image description here