在 ggplot2 (R) 中围绕不同形状的品种放置边框
Place a border around different shape varieties in ggplot2 (R)
试图在 ggplot2
中的 geom_point()
周围放置边框时,this question 是一个非常有用的起点。我最终选择了@joran(第二个答案)概述的方法,因为它允许我获得更小的轮廓(这是更可取的,因为这些点在最终产品中最终会非常小)。
但是,我在使用这种技术的细微变化时遇到了问题。我有两个不同的形状品种要勾勒出轮廓,这给我带来了一些问题。这是一个可重现的例子:
require('ggplot2')
values <- rnorm(n = 10, mean = 1, sd = 0.5) + c(1:10)
df <- data.frame(id = rep(c('hq', 'lq'), each = 5),
values = values,
period = rep(c(1:5), 2))
plot <-
ggplot(df, aes(x = period,
y = values,
group = id)) +
geom_line(color = 'gray40') +
geom_point(aes(shape = id,
color = id),
size = 3) +
geom_point(aes(shape = id),
color = 'gray70',
size = 3,
show_guide = FALSE) +
scale_color_manual(values = c('lightskyblue1', 'lightpink'),
labels = c('HQ', 'LQ')) +
scale_shape_manual(values = c(15, 16, 0, 1),
labels = c('HQ', 'LQ')) +
theme_bw()
这最终给出了一个看起来像这样的情节:
我不明白为什么这些点会变成纯灰色(这是我希望蓝色和粉红色点周围的边框颜色)。如果您能帮助我们保留蓝色和粉色填充以及与形状类型匹配的灰色边框,我们将不胜感激!
编辑:如果不清楚,我知道我可以使用 pch 21-25
来实现边框。然而,这些边界太大并且它们的厚度不可修改(据我所知)。因此,我试图将两个 geom_points()
分层,一个填充,另一个未填充,以实现边框的外观。我可以通过像这样分层另一组 geom_point()
来完成此操作:
plot <-
ggplot(df, aes(x = period,
y = values,
group = id)) +
geom_line(color = 'gray40') +
geom_point(aes(shape = id,
color = id),
size = 3) +
geom_point(shape = 1,
color = 'gray70',
size = 3,
show_guide = FALSE) +
scale_color_manual(values = c('lightskyblue1', 'lightpink'),
labels = c('HQ', 'LQ')) +
scale_shape_manual(values = c(15, 16),
labels = c('HQ', 'LQ')) +
theme_bw()
这里的问题是每个"border"都没有匹配到对应的形状,结果图像是这样的:
已编辑
我误读了你的问题。无论如何,解决方案的顺序是 geom_point
:
第一个在背景中,所以我用它来绘制更大的灰色形状(尺寸 5)
geom_point(aes(shape = id),
color = 'gray70',
size = 5,
show_guide = FALSE)
第二个画彩色形状:
geom_point(aes(shape = id,
color = id),
size = 3)
这是:
plot <-
ggplot(df, aes(x = period,
y = values,
group = id)) +
geom_line(color = 'gray40') +
geom_point(aes(shape = id),
color = 'gray70',
size = 5,
show_guide = FALSE) +
geom_point(aes(shape = id,
color = id),
size = 3) +
scale_color_manual(values = c('lightskyblue1', 'lightpink'),
labels = c('HQ', 'LQ')) +
scale_shape_manual(values = c(15, 16, 0, 1),
labels = c('HQ', 'LQ')) +
theme_bw()
使用这段代码我可以实现这个结果:
刚刚看到@mucio 更新了他的答案 - 我认为他的答案更优雅一些,尽管这种方式可能会给你想要的细边框。
由于您两次都使用 id
作为形状图例,因此彩色形状和灰色形状都已填充。解决这个问题的一种方法(诚然是一种 hack,但到目前为止似乎并没有阻止你),是创建一个具有新级别的新变量并将其用于灰色形状中的形状。 (另请注意,我不得不重新排列形状规格的顺序)。
df$id2 <- ifelse(df$id == 'hq', 'hq_alt', 'lq_alt')
plot <-
ggplot(df, aes(x = period,
y = values,
group = id)) +
geom_line(color = 'gray40') +
geom_point(aes(shape = id,
color = id),
size = 3) +
geom_point(aes(shape = id2),
color = 'gray70',
size = 3,
show_guide = FALSE) +
scale_color_manual(values = c('lightskyblue1', 'lightpink'),
labels = c('HQ', 'LQ')) +
scale_shape_manual(values = c(15, 0, 16, 1),
labels = c('HQ', 'LQ'), guide=F) +
theme_bw()
实际上,您不必使用那么多 aes
。 ggplot
中只有一个aes
就够了。 aes
将自动应用于另一个 geom_..
,除非它被覆盖。
plot <-
ggplot(df, aes(x = period, y = values, group = id, shape = id, color=id)) +
geom_line(color = 'gray40') +
geom_point(color = 'gray70', size = 5, show_guide = FALSE) +
geom_point(size = 3) +
scale_color_manual(values = c('lightskyblue1', 'lightpink'), labels = c('HQ', 'LQ')) +
scale_shape_manual(values = c(15, 16, 0, 1), labels = c('HQ', 'LQ')) +
theme_bw()
试图在 ggplot2
中的 geom_point()
周围放置边框时,this question 是一个非常有用的起点。我最终选择了@joran(第二个答案)概述的方法,因为它允许我获得更小的轮廓(这是更可取的,因为这些点在最终产品中最终会非常小)。
但是,我在使用这种技术的细微变化时遇到了问题。我有两个不同的形状品种要勾勒出轮廓,这给我带来了一些问题。这是一个可重现的例子:
require('ggplot2')
values <- rnorm(n = 10, mean = 1, sd = 0.5) + c(1:10)
df <- data.frame(id = rep(c('hq', 'lq'), each = 5),
values = values,
period = rep(c(1:5), 2))
plot <-
ggplot(df, aes(x = period,
y = values,
group = id)) +
geom_line(color = 'gray40') +
geom_point(aes(shape = id,
color = id),
size = 3) +
geom_point(aes(shape = id),
color = 'gray70',
size = 3,
show_guide = FALSE) +
scale_color_manual(values = c('lightskyblue1', 'lightpink'),
labels = c('HQ', 'LQ')) +
scale_shape_manual(values = c(15, 16, 0, 1),
labels = c('HQ', 'LQ')) +
theme_bw()
这最终给出了一个看起来像这样的情节:
我不明白为什么这些点会变成纯灰色(这是我希望蓝色和粉红色点周围的边框颜色)。如果您能帮助我们保留蓝色和粉色填充以及与形状类型匹配的灰色边框,我们将不胜感激!
编辑:如果不清楚,我知道我可以使用 pch 21-25
来实现边框。然而,这些边界太大并且它们的厚度不可修改(据我所知)。因此,我试图将两个 geom_points()
分层,一个填充,另一个未填充,以实现边框的外观。我可以通过像这样分层另一组 geom_point()
来完成此操作:
plot <-
ggplot(df, aes(x = period,
y = values,
group = id)) +
geom_line(color = 'gray40') +
geom_point(aes(shape = id,
color = id),
size = 3) +
geom_point(shape = 1,
color = 'gray70',
size = 3,
show_guide = FALSE) +
scale_color_manual(values = c('lightskyblue1', 'lightpink'),
labels = c('HQ', 'LQ')) +
scale_shape_manual(values = c(15, 16),
labels = c('HQ', 'LQ')) +
theme_bw()
这里的问题是每个"border"都没有匹配到对应的形状,结果图像是这样的:
已编辑
我误读了你的问题。无论如何,解决方案的顺序是 geom_point
:
第一个在背景中,所以我用它来绘制更大的灰色形状(尺寸 5)
geom_point(aes(shape = id), color = 'gray70', size = 5, show_guide = FALSE)
第二个画彩色形状:
geom_point(aes(shape = id, color = id), size = 3)
这是:
plot <-
ggplot(df, aes(x = period,
y = values,
group = id)) +
geom_line(color = 'gray40') +
geom_point(aes(shape = id),
color = 'gray70',
size = 5,
show_guide = FALSE) +
geom_point(aes(shape = id,
color = id),
size = 3) +
scale_color_manual(values = c('lightskyblue1', 'lightpink'),
labels = c('HQ', 'LQ')) +
scale_shape_manual(values = c(15, 16, 0, 1),
labels = c('HQ', 'LQ')) +
theme_bw()
使用这段代码我可以实现这个结果:
刚刚看到@mucio 更新了他的答案 - 我认为他的答案更优雅一些,尽管这种方式可能会给你想要的细边框。
由于您两次都使用 id
作为形状图例,因此彩色形状和灰色形状都已填充。解决这个问题的一种方法(诚然是一种 hack,但到目前为止似乎并没有阻止你),是创建一个具有新级别的新变量并将其用于灰色形状中的形状。 (另请注意,我不得不重新排列形状规格的顺序)。
df$id2 <- ifelse(df$id == 'hq', 'hq_alt', 'lq_alt')
plot <-
ggplot(df, aes(x = period,
y = values,
group = id)) +
geom_line(color = 'gray40') +
geom_point(aes(shape = id,
color = id),
size = 3) +
geom_point(aes(shape = id2),
color = 'gray70',
size = 3,
show_guide = FALSE) +
scale_color_manual(values = c('lightskyblue1', 'lightpink'),
labels = c('HQ', 'LQ')) +
scale_shape_manual(values = c(15, 0, 16, 1),
labels = c('HQ', 'LQ'), guide=F) +
theme_bw()
实际上,您不必使用那么多 aes
。 ggplot
中只有一个aes
就够了。 aes
将自动应用于另一个 geom_..
,除非它被覆盖。
plot <-
ggplot(df, aes(x = period, y = values, group = id, shape = id, color=id)) +
geom_line(color = 'gray40') +
geom_point(color = 'gray70', size = 5, show_guide = FALSE) +
geom_point(size = 3) +
scale_color_manual(values = c('lightskyblue1', 'lightpink'), labels = c('HQ', 'LQ')) +
scale_shape_manual(values = c(15, 16, 0, 1), labels = c('HQ', 'LQ')) +
theme_bw()