我的目标是传递单独的值,以更改用于在不同几何图形中填充美学的颜色。
例如:
ggplot(iris, aes(x = Species, y = Sepal.Length)) +
stat_summary(aes(fill = Species), color = 'black', geom = 'bar', fun.y = mean) +
geom_point(aes(fill = Species), color = 'black', shape = 21) +
scale_fill_manual(values = c('royal blue', 'red2', 'limegreen'))
在此绘图中,我希望能够使用单独的颜色来填充条形图和点。这可能吗?我知道使用scale_fill_manual()
将颜色设置为我想要的任何值,但这会将条形图和点的填充更改为相同的颜色。
这是我正在尝试做的一个半成品例子,但是传说不存在了……
iris_j <- iris %>%
mutate(Species_bar = factor(paste0(Species, '_bar')))
color.groups <- c('royal blue', 'red2', 'limegreen', NA, 'royal blue', 'white')
names(color.groups) <- c(levels(iris_j$Species), levels(iris_j$Species_bar))
ggplot(iris_j, aes(x = Species, y = Sepal.Length)) +
stat_summary(aes(fill = Species_bar), color = 'black', geom = 'bar', fun.y = mean) +
geom_point(aes(fill = Species), color = 'black', shape = 21) +
scale_fill_manual(values = color.groups)
答案 0 :(得分:4)
这是ggplot的局限性之一-美感只能映射到单个变量。一般来说,我发现它是一个合理的限制,因为它阻止了许多令人困惑且难以理解的图形。就是说,有了一些创造力,就可以解决它,例如通过用color
美学为点着色,然后过度绘图以添加笔触:
library(ggplot2)
ggplot(iris, aes(x = Species, y = Sepal.Length)) +
stat_summary(aes(fill = Species), color = 'black', geom = 'bar', fun.y = mean) +
geom_point(aes(color = Species)) + # add colored points
geom_point(color = 'black', shape = 21, show.legend = TRUE) + # add point strokes (including in legend)
scale_color_manual(values = c('royal blue', 'red2', 'limegreen')) + # define point colors
scale_fill_manual(values = c(NA, 'royal blue', 'white')) # define bar colors
要分隔图例,请为每个图例指定不同的名称。要将笔划添加到图例中的点,您需要在guide_legend
中有效地对其进行重建。 (根据文档,为show.legend
提供命名向量应该可以,但实际上却失败了。)
ggplot(iris, aes(x = Species, y = Sepal.Length)) +
stat_summary(aes(fill = Species), color = 'black', geom = 'bar', fun.y = mean) +
geom_point(aes(color = Species)) +
geom_point(color = 'black', shape = 21) +
scale_color_manual('points', values = c('royal blue', 'red2', 'limegreen'),
guide = guide_legend(override.aes = list(shape = 21, color = 'black',
fill = c('royal blue', 'red2', 'limegreen')))) +
scale_fill_manual('bars', values = c(NA, 'royal blue', 'white'))
这种方法不会推广到原本已经使用颜色的绘图中。
答案 1 :(得分:3)
以下是您可以尝试借鉴的一些小方法。
首先,如果您不需要使用填充形状,则可以将颜色映射到geom_point
中的种类,这样就具有了色标和填充比例。在这种情况下,我更改了填充标签,将其标记为标记,以显示如何将它们分成两个图例。
library(tidyverse)
light_colors <- c("#87CEEB", "#FFB6C1", "#FF8C69")
dark_colors <- c("#22A0D6", "#E33650", "#BF411B")
ggplot(iris, aes(x = Species, y = Sepal.Length)) +
stat_summary(aes(fill = Species), geom = "bar", fun.y = mean) +
geom_point(aes(color = Species)) +
scale_fill_manual(values = light_colors) +
scale_color_manual(values = dark_colors) +
labs(fill = "Mean by Species")
第二,如果需要需要填充的形状,请让geom_point
获取填充比例并砍掉条形以使用颜色。一种方法是通过使看起来像条形但实际上实际上geom_segment
大的条形。我更改了图例的大小,以使图例键不会变得异常可笑。
ggplot(iris, aes(x = Species, y = Sepal.Length)) +
stat_summary(aes(xend = Species, yend = 0, color = Species), geom = "segment", fun.y = mean, size = 30, lineend = "butt") +
geom_point(aes(fill = Species), color = "black", shape = 21) +
scale_fill_manual(values = light_colors) +
scale_color_manual(values = dark_colors, guide = guide_legend(override.aes = list(size = 4)))
第三种方法,制作一个平均值的数据框,并给它一个变量以表示已获得平均值,然后将一个变量添加到原始数据框以表示其为观测值。然后,您可以映射类型与物种的相互作用,以在一个填充比例尺中获得单独的颜色。
avgs <- iris %>%
group_by(Species) %>%
summarise(Sepal.Length = mean(Sepal.Length)) %>%
mutate(type = "Mean")
iris %>%
select(Species, Sepal.Length) %>%
mutate(type = "Observation") %>%
ggplot(aes(x = Species, y = Sepal.Length, fill = interaction(Species, type))) +
geom_col(data = avgs) +
geom_point(color = "black", shape = 21)
答案 2 :(得分:2)
并不是一个完美的解决方案,但这可能是一个足够的解决方法
df.join(pd.get_dummies(df.gender, drop_first=True))
gender Male
0 Female 0
1 Male 1
2 Male 1
3 Male 1
4 Female 0
5 Female 0
6 Male 1
7 Female 0
8 Female 0
9 Female 0
根据需要调整颜色,alpha和其他图形参数。