我有一个图,我想用灰线将点连接在一起。我想知道有没有办法在点周围添加边框,以便线接触到它们的边界,或者甚至不接触点,而不是直接进入点的中心。我正在使用 ggplot。
我已经包含了一些示例数据,供任何想要使用它的人使用。
df <- data.frame(Name = c("a","b","c","d","e","f"),
Category = c("x","y","x","y","x","y"),
N = c(500,540,470,500,480,520))
我还包含了我的 ggplot 代码,用于制作上面的图
df %>%
arrange(N) %>%
mutate(Name = factor(Name, levels = unique(Name))) %>%
ggplot(aes(Name, N)) +
geom_point(aes(color = Category)) +
geom_point(shape = 1,size = 2,colour = "black") +
scale_colour_manual(values = c("green","cyan")) +
geom_line(aes(group = Name), colour = "grey", alpha = 1) +
theme(
axis.title.x = element_blank(),
axis.ticks = element_blank(),
axis.title.y = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.text.x = element_blank(),
panel.background = element_rect(fill = "white"),
legend.position = "none")
编辑:
如下面的注释所示,将线切换到点工作之前并产生以下结果:
答案 0 :(得分:1)
我认为您的情节不能用 Name
的独特字母重现。为了适合一条垂直线,Name
需要唯一的“成对”字母。在您对 ggplot()
的调用中,Name
被映射到 x 轴并且也被传递到组美学,它在相同的两点之间产生一条线 x 值。例如,您的数据框应如下所示:
Name Category N
1 A x 500
2 A y 540
3 B x 470
4 B y 500
5 C x 480
6 C y 520
注意,每组由两个观察值组成,它们应该仅沿垂直维度变化。
我想您的数据框已被更正以说明这一点,但您提供的代码并不清楚。看来@erocoar 已经在评论中解决了您的主要问题。对于 geom_
层,这是一个简单的优先级问题。
我使用新的数据框重现了您的情节。请记住,对于这项工作,我们必须对每组进行多次观察。
library(dplyr)
library(ggplot2)
df <- data.frame(
Name = rep(c("A", "B", "C"), each = 2), # unique pairs (two observations per group)
Category = c("x", "y", "x", "y", "x", "y"),
N = c(500, 540, 470, 500, 480, 520)
)
df %>%
arrange(N) %>%
mutate(Name = factor(Name, levels = unique(Name))) %>%
ggplot(aes(x = Name, y = N)) +
geom_line(aes(group = Name), colour = "grey", alpha = 1) + # feeding Name to the group aesthetic
geom_point(aes(color = Category)) +
geom_point(shape = 1,size = 2,colour = "black") +
scale_colour_manual(values = c("green", "cyan")) +
theme(
axis.title.x = element_blank(),
axis.ticks = element_blank(),
axis.title.y = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.text.x = element_blank(),
panel.background = element_rect(fill = "white"),
legend.position = "none")