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

30

我想在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") 

我希望只有一个棒柱被着色,其他三个保持默认颜色(深灰色,而不是黑色,因为黑色对我来说看起来很糟糕)。 我该如何改变仅一个棒柱的颜色或获取棒柱默认颜色的名称以将其替换为黑色?


如果您不想将fill映射到'area',为什么要在aes中使用它?更好的方法可能是向数据框添加一个变量,反映您希望映射到fill的条件。但您需要更清楚地描述您的目标。 - Henrik
我想通过颜色区分第二个条形图和其他条形图,其他条形图应该保持默认的、不变的颜色。这就是我想要的。 - jjankowiak
对于您提供的示例,scale_fill_manual 是完美的选择。如果您想以更“程序化”的方式进行操作,则需要提供一些指标(计算、cut 范围等),以便确定哪个柱形图应该是不同的颜色。对于您的示例,是什么条件表明 Południe 应该是红色的? - hrbrmstr
2个回答

39
如果你喜欢在ggplot调用中包含所有内容,你可以在fill的factor()函数内使用ifelse语句,如下所示。
这也将图例分为两个类别(即突出显示和未突出显示),这样你就不会重复显示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

如果不需要图例,可以在geom_bar()函数中添加show.legend = FALSE来生成以下内容:

Plot without legend


这是珍贵的。 - Rômulo Barros

28

选项1:只更改一个条的颜色。根据Henrick的建议,您可以创建一个新变量,其中默认颜色为NA,非默认颜色为字符字符串/因子(第一个恰好是红色):

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(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

只是一个小更新,因为 area.colour <- c(NA, "withcolor", NA, NA) 对我没有起作用(第1、3和4个条形图简单地消失了)。相反,我使用了 area.colour <- c("one", "two", "one", "one") 然后 scale_fill_manual(values = c("gray50", "red")),这像魔法一样奏效了(你可以轻松地控制图例标签与 area.colour 中的任何内容)。 - m-dz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接