在R中使用ggplot在同一图中绘制多条线

h43kikqp  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(205)

我需要画多个线图,其中有一些分组。我的数据如下:

roc_mj_cmb_t1= c(0.8115,0.8060,0.8114,0.8340,0.8789,0.8743,0.8807,0.8838,
                 0.7946,0.7904,0.8245,0.8198,0.8721,0.8686,0.8876,0.8763,
                 0.8204,0.8146,0.7982,0.8350, 0.7977,0.8021,0.8137,0.8176


)

roc_mj_lab= c(rep("Y1_uni_cmb_test1",4),rep("Y1_Joint_test1",4),
          rep("Y1_uni_cmb_test2",4),rep("Y1_Joint_test2",4),
          rep("Y1_uni_both_test1",4), rep("Y1_uni_both_test2",4))

settin=c("setting 1","setting 2","setting 3","setting 4","setting 1","setting 2","setting 3","setting 4"
         ,"setting 1","setting 2","setting 3","setting 4","setting 1","setting 2","setting 3","setting 4"
         ,"setting 1","setting 2","setting 3","setting 4","setting 1","setting 2","setting 3","setting 4")

data_mj=data.frame(settin,roc_mj_cmb_t1,roc_mj_lab)

然后我使用以下代码获得了线图:

ggplot(data=data_mj,
       aes(y=roc_mj_cmb_t1,x=settin, group=roc_mj_lab))+
  geom_line(
         aes(color=roc_mj_lab,linetype=roc_mj_lab))
+scale_color_manual(values = c("blue", "red", "blue", "red","blue", "red")
       )+ylim(0.75,0.9) +scale_linetype_manual(values=c("longdash", "solid","longdash", "solid",
                                                        "dotted","dotted"))

以下是我的输出:

在这个图中,我需要从相同颜色的“Y1_XXX_test1”和相同颜色的“Y1_XXX_test2”开始绘制线条。“Y1_XXX_test1”中的3个图需要使用线型进行区分。类似的事情也需要应用于“Y1_XXX_test2”。
但是基于这段代码,我得到了与我指定的不同的颜色。(例如:(黄色、绿色和粉色的线条)这可能是什么原因呢?

ajsxfq5m

ajsxfq5m1#


您的一个“+"的位置错误。此行中的+:“+scale_color_manual..”需要在前一行的末尾,当我像下面这样清理的时候,我得到了你的蓝线和红线。

ggplot(data=data_mj,aes(y=roc_mj_cmb_t1,x=settin, group=roc_mj_lab))+
  geom_line(aes(color=roc_mj_lab,linetype=roc_mj_lab)) +
  scale_color_manual(values = c("blue", "red", "blue", "red","blue", "red"))+
  ylim(0.75,0.9) +
  scale_linetype_manual(values=c("longdash", "solid","longdash", "solid","dotted","dotted"))
ulydmbyx

ulydmbyx2#

这个技巧并不是硬编码每种颜色/线型,它将roc_mj_lab分成不同的“类型”组,并根据它们设置线型/颜色。(一个副作用是它将图例分成两个。)

data_mj |>
  transform(
    middle = sub("Y[^_]*_(.*)_.*$", "\\1", roc_mj_lab),
    test = sub(".*_", "", roc_mj_lab)
  ) |>
  ggplot(aes(x = settin, y = roc_mj_cmb_t1, group = roc_mj_lab)) +
  geom_line(aes(color = test, linetype = middle)) +
  scale_color_manual(values = c(test1 = "blue", test2 = "red")) +
  scale_linetype_manual(values = c(Joint = "longdash", uni_cmb = "solid", uni_both = "dotted"))

诀窍在于,当你想让某些东西共享一种颜色时,数据中需要有一个变量,该变量的值与这些东西的值相同。如果我们查看上面数据的第一个transform变量,你会看到我创建的变量:

data_mj |>
  transform(
    middle = sub("Y[^_]*_(.*)_.*$", "\\1", roc_mj_lab),
    test = sub(".*_", "", roc_mj_lab)
  )
#       settin roc_mj_cmb_t1        roc_mj_lab   middle  test
# 1  setting 1        0.8115  Y1_uni_cmb_test1  uni_cmb test1
# 2  setting 2        0.8060  Y1_uni_cmb_test1  uni_cmb test1
# 3  setting 3        0.8114  Y1_uni_cmb_test1  uni_cmb test1
# 4  setting 4        0.8340  Y1_uni_cmb_test1  uni_cmb test1
# 5  setting 1        0.8789    Y1_Joint_test1    Joint test1
# 6  setting 2        0.8743    Y1_Joint_test1    Joint test1
# 7  setting 3        0.8807    Y1_Joint_test1    Joint test1
# 8  setting 4        0.8838    Y1_Joint_test1    Joint test1
# 9  setting 1        0.7946  Y1_uni_cmb_test2  uni_cmb test2
# 10 setting 2        0.7904  Y1_uni_cmb_test2  uni_cmb test2
# 11 setting 3        0.8245  Y1_uni_cmb_test2  uni_cmb test2
# 12 setting 4        0.8198  Y1_uni_cmb_test2  uni_cmb test2
# 13 setting 1        0.8721    Y1_Joint_test2    Joint test2
# 14 setting 2        0.8686    Y1_Joint_test2    Joint test2
# 15 setting 3        0.8876    Y1_Joint_test2    Joint test2
# 16 setting 4        0.8763    Y1_Joint_test2    Joint test2
# 17 setting 1        0.8204 Y1_uni_both_test1 uni_both test1
# 18 setting 2        0.8146 Y1_uni_both_test1 uni_both test1
# 19 setting 3        0.7982 Y1_uni_both_test1 uni_both test1
# 20 setting 4        0.8350 Y1_uni_both_test1 uni_both test1
# 21 setting 1        0.7977 Y1_uni_both_test2 uni_both test2
# 22 setting 2        0.8021 Y1_uni_both_test2 uni_both test2
# 23 setting 3        0.8137 Y1_uni_both_test2 uni_both test2
# 24 setting 4        0.8176 Y1_uni_both_test2 uni_both test2
lc8prwob

lc8prwob3#

你想要这个吗?只要把它变成正确的形式:

ggplot(data=data_mj,
       aes(y=roc_mj_cmb_t1,x=settin, group=roc_mj_lab))+
  geom_line(aes(color=roc_mj_lab,linetype=roc_mj_lab), linewidth=1) +
  scale_color_manual(values = c("blue", "red", "blue", "red","blue", "red")) +
  ylim(0.75,0.9) +
  scale_linetype_manual(values=c("longdash", "solid","longdash", "solid",
                                 "dotted","dotted"))

相关问题