ggplot 将 geom_point 与 geom_line 分开的方法?

时间:2021-04-01 16:43:26

标签: r ggplot2

我有一个图,我想用灰线将点连接在一起。我想知道有没有办法在点周围添加边框,以便线接触到它们的边界,或者甚至不接触点,而不是直接进入点的中心。我正在使用 ggplot。

enter image description here

我已经包含了一些示例数据,供任何想要使用它的人使用。

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")

编辑:

如下面的注释所示,将线切换到点工作之前并产生以下结果:

enter image description here

1 个答案:

答案 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")

two observations per pair