如何使用线条和两个*不同的*点符号绘制两组数据,并在图例中使用*可区分的*数据点符号?

时间:2018-04-10 22:25:35

标签: r ggplot2

我一直试图用不同的点符号使用R包{{连接不同颜色的线来绘制两组数据的图表。 1}},但是对于我的生活,我无法通过显示每条曲线的相关数据点符号来正确区分两条曲线

我可以让图例显示不同的行颜色。但我无法使图例为每组数据显示不同的数据点符号

以下代码:

ggplot2

输出此图表:

plot

但图例中的数据点符号可区分。图例显示两个图形的相同符号(由两个数据点符号组成)。

一种可能的解决方案是将线程数定义为df <- data.frame( thrd_cnt=c(1,2,4,8,16), runtime4=c(53,38,31,41,54), runtime8=c(54,35,31,35,44)) library("ggplot2") print( ggplot(data = df, aes(df$thrd_cnt, y=df$runtime, color=)) + geom_line(aes(y=df$runtime4, color = "4 cores")) + geom_point(aes(y=df$runtime4, color = "4 cores"), fill = "white", size = 3, shape = 21) + geom_line(aes(y=df$runtime8, color = "8 cores")) + geom_point(aes(y=df$runtime8, color = "8 cores"), fill = "white", size = 3, shape = 23) + xlab("Number of Threads") + ylab(substitute(paste("Execution Time, ", italic(milisec)))) + scale_x_continuous(breaks=c(1,2,4,8,16)) + theme(legend.position = c(0.3, 0.8)) + labs(color="# cores") ) ## save a pdf and a png ggsave("runtime.pdf", width=5, height=3.5) ggsave("runtime.png", width=5, height=3.5) ,然后我可以在图例右侧获取数据点符号,但我仍然不知道如何做到这一点。 / p>

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

收集到“长”格式的数据框后,将颜色和形状(pch)传递给美学论点:

library(tidyverse)
    df <- data.frame( thrd_cnt=c(1,2,4,8,16),
                      runtime4=c(53,38,31,41,54),
                      runtime8=c(54,35,31,35,44))

    df %>% gather(key=run, value=time, -thrd_cnt) %>%
      ggplot(aes(thrd_cnt, time, pch=run, colour=run)) + geom_line() + geom_point()

(注意代码与原始帖子相比有多简短)

enter image description here

答案 1 :(得分:0)

shape也很好,如果你用df做更多的东西,可能有意义转换并保持长,'整洁'格式。

   library("ggplot2")
   df <- data.frame( thrd_cnt=c(1,2,4,8,16),
              runtime4=c(53,38,31,41,54),
              runtime8=c(54,35,31,35,44))

   df <- df %>% gather("runtime", "millisec", 2:3)

   ggplot(data = df, aes(x = thrd_cnt, y = millisec, color = runtime, shape = 
   runtime)) + geom_line() + geom_point()

答案 2 :(得分:0)

如上所述,您需要将gather数据转换为长格式,以便将cores变量映射到颜色和形状。要保持与原始图表中相同的形状和填充选项,请使用scale_shape_manual设置与cores的每个级别对应的形状。请注意,您需要在colour中为shapelabs()图例设置名称,以确保它们重合并且不会生成两个图例。我还使用了mutate,因此cores的级别不会混淆地包含runtime这个词。

df <- data.frame( thrd_cnt=c(1,2,4,8,16),
                  runtime4=c(53,38,31,41,54),
                  runtime8=c(54,35,31,35,44))
library(tidyverse)
ggplot(
  data = df %>%
    gather(cores, runtime, runtime4, runtime8) %>%
    mutate(cores = str_c(str_extract(cores, "\\d"), " cores")),
  mapping = aes(x = thrd_cnt, y = runtime, colour = cores)
  ) +
  geom_line() +
  geom_point(aes(shape = cores), size = 3, fill = "white") +
  scale_x_continuous(breaks = c(1, 2, 4, 8, 16)) +
  scale_shape_manual(values = c("4 cores" = 21, "8 cores" = 23)) +
  theme(legend.position = c(0.3, 0.8)) +
  labs(
    x = "Number of Threads",
    y = "Execution Time (millisec)",
    colour = "# cores",
    shape = "# cores"
  )

reprex package(v0.2.0)创建于2018-04-10。