改变ggplot中只有一个条形的颜色

时间:2014-04-06 12:36:06

标签: r ggplot2 colors bar-chart

我想在ggplot中只为一个条形颜色。这是我的数据框:

area <- c("Północ", "Południe", "Wschód", "Zachód")
sale <- c(16.5, 13.5, 14, 13)
df.sale <- data.frame(area, sale)
colnames(df.sale) <- c("Obszar sprzedaży", "Liczba sprzedanych produktów (w tys.)")

用于绘图的代码:

plot.sale.bad <- ggplot(data=df.sale, aes(x=area, y=sale, fill=area)) +
  geom_bar(stat="identity") +
  scale_fill_manual(values=c("black", "red", "black", "black")) +
  xlab(colnames(df.sale)[1]) +
  ylab(colnames(df.sale)[2]) +
  ggtitle("Porównanie sprzedaży") 

我想只有一个彩色条和另外3个有默认颜色(暗灰色,不是黑色,对我来说看起来很糟糕)。如何更改仅在条形图上的颜色或如何获取条形图的默认颜色名称而不是黑色?

2 个答案:

答案 0 :(得分:13)

选项1:仅更改一个条形的颜色。根据Henrick的建议,您可以使用NAs创建一个新变量,用于默认颜色和非默认颜色的字符串/因子(第一个恰好是红色):

area.color <- c(NA, "withcolor", NA, NA)
plot.sale.bad <- ggplot(data=df.sale, aes(x=area, y=sale, fill=area.color)) +
  geom_bar(stat="identity") +
  xlab(colnames(df.sale)[1]) +
  ylab(colnames(df.sale)[2]) +
  ggtitle("Porównanie sprzedaży") 
plot.sale.bad

选项2:找到您喜欢的默认深灰色的名称。如果您只是删除原始代码中的scale_fill_manual行,那么这不是默认颜色(在这种情况下,您会获得四种不同的粉彩),所以我假设您的意思是由本段上方的代码块生成的灰色,对于那些area.color==NA的酒吧。在这种情况下,您可能会查看scale_fill_discrete的源代码(或args,无论如何):

> args(scale_fill_discrete)
# function (..., h = c(0, 360) + 15, c = 100, l = 65, h.start = 0, 
#     direction = 1, na.value = "grey50") 
# NULL

na.value的默认值为"grey50"。因此,如果您想使用scale_fill_manual,您可以这样做:

plot.sale.bad <- ggplot(data=df.sale, aes(x=area, y=sale, fill=area)) +
  geom_bar(stat="identity") +
  scale_fill_manual(values=c("grey50", "red", "grey50", "grey50")) +
  xlab(colnames(df.sale)[1]) +
  ylab(colnames(df.sale)[2]) +
  ggtitle("Porównanie sprzedaży") 
plot.sale.bad

答案 1 :(得分:6)

如果您希望ggplot调用中包含所有内容,则可以在ifelse中使用factor()语句进行填充,如下所示。

这也将图例分为两类(即突出显示和未突出显示),因此您无需重复x轴上显示的值。这也为图例中的情节提供了另一个说明性的维度。

plot.sale.bad2 <- ggplot(data=df.sale,
                         aes(x=area,
                             y=sale,
                             fill=factor(ifelse(area=="Południe","Highlighted","Normal")))) +
  geom_bar(stat="identity") +
  scale_fill_manual(name = "area", values=c("red","grey50")) +
  xlab(colnames(df.sale)[1]) +
  ylab(colnames(df.sale)[2]) +
  ggtitle("Porównanie sprzedaży") 

plot.sale.bad2

Plot with legend

如果不需要图例,则可以将show.legend = FALSE添加到geom_boxplot()调用中以产生以下内容:

Plot without legend