ggplot2-如果为负则反转颜色

时间:2018-08-23 16:16:09

标签: r ggplot2

我正在尝试制作类似的图片,但是带有自定义图例。我可以向图例中未添加的图例添加一些东西吗? 为此,我使用“ fill = 1:nrow(df)”能够准确选择在什么颜色的条形。 但我也想展示一个图例,仅用7种颜色,然后选择哪种颜色与哪个标签搭配。

enter image description here

一个有效的例子。 是否可以在此处仅显示一个标签的图例并选择在图例中显示哪种颜色?

谢谢!

df <- data.frame(Var1 = c("A", "A", "B", "B"),
           Var2 = rep(c("Year 2011", "Year 2012"),2),
           value = c(0.1,-0.1,0.3,0.05),
           Var3 = c("#719500", "#AC1A2F", "#719500", "#719500"))

df %>% 
    ggplot(aes(x=Var1, y=value, fill=factor(1:nrow(df)))) + 
    geom_bar(stat="identity",
             position = position_dodge(width=0.9), show.legend = F) + 
    scale_fill_manual(drop = FALSE, 
                      values = df$Var3, 
                      labels = levels(df$Var2))

3 个答案:

答案 0 :(得分:1)

我不完全确定这可以解决您的问题,但是另一种思考方式是将每种颜色所需的label用作fill,并指定与哪种颜色对应scale_fill_manual中的哪个标签。

在您的示例中,如果我们为“正”使用一种颜色,为“负”使用一种颜色,则将是,首先我们将获得带有突变的“类型”。然后,我们将使用“类型”作为“填充”进行绘制。要指定颜色,我们可以使用scale_fill_manual

df <- mutate(df, type = ifelse(value > 0, "positive", "negative"))
df %>% 
    ggplot(aes(x=Var1, y=value, fill=type)) + 
    geom_bar(stat="identity",
             position = position_dodge(width=0.9)) +
    scale_fill_manual(values = c(positive = "#719500", negative = "#AC1A2F"))

如果绘制此图例,则图例可能未按所需顺序排列。我建议将“类型”列转换为一个因子,并在级别中指定所需的顺序,即:

df$type <- factor(df$type, levels = c("positive", "negative"))

在我们的type图例中,它会在“负”之前产生“正”。

答案 1 :(得分:0)

实际映射颜色渐变而不是手动分配颜色怎么样?

df %>% 
ggplot(aes(x=Var1, y=value, fill=value, group = value)) + 
geom_bar(stat="identity",
         position = position_dodge(width=0.9), show.legend = T)+
scale_fill_gradient2( low= '#ff2d2d', high = '#9ee0ff', mid = 'grey50',midpoint=0, guide='colorbar')

答案 2 :(得分:0)

感谢 csgroen ,我找到了所需的解决方案。非常感谢他。

我需要什么:
在x轴上绘制一些问题,以显示几年的变化。值可以是正数或负数。所以我想要2011年为深绿色/红色,2012年为浅绿色/红色,等等。

我的问题是显示一种特定的颜色一年并显示正确的图例。因为每年都有两种可能的填充色,但是我只希望图例显示其中一种。

data.frame

df <- data.frame(Var1 = paste("Question", c("A", "A", "B", "B", "C", "C")),
                 Var2 = rep(c("Year: 2011", "Year: 2012", "Year: 2013"), 2),
                 value = c(0.1, -0.1, 0.3, 0.05, -0.17, 0.25))

如答案中所建议,我创建了一个新的填充变量,该变量将根据值是正数还是负数进行标记。
变量df $ type必须是所有可能水平的一个因素。

df$type <- ifelse(df$value < 0,
                  paste(df$Var2, "negative"),
                  paste(df$Var2, "positive"))
df$type <- factor(
  df$type, 
  c(paste("Year:", 2011, c("positive", "negative")),
    paste("Year:", 2012, c("positive", "negative")),
    paste("Year:", 2013, c("positive", "negative")))
)

情节

我使用drop = FALSE来显示df $ type的所有级别,无论它们是否在图中显示。
breaks = c()仅在图例中显示正水平。并且labels = c()正确命名了它们。

df %>% 
  ggplot(aes(x=Var1, y=value, fill=type)) + 
  geom_bar(stat="identity",
           position = position_dodge(width=0.9)) +
  scale_fill_manual(
    values = c("Year: 2011 positive" = "#719500",
               "Year: 2011 negative" = "#AC1A2F",
               "Year: 2012 positive" = "#89B400",
               "Year: 2012 negative" = "#D22039",
               "Year: 2013 positive" = "#A9DE00",
               "Year: 2013 negative" = "#E96D7F"),
    breaks = c("Year: 2011 positive",
               "Year: 2012 positive",
               "Year: 2013 positive"),
    labels = c("2011", "2012", "2013"),
    drop=FALSE)

结果

enter image description here