R: ggplot2 - Ручная установка формы точки, типа линии и цвета в соответствии с меткой

Я пытаюсь сделать график с вручную установленными цветами и вручную заданными формами как для точек, так и для линий. Фрейм данных, с которым я работаю, имеет следующий формат:

"n" "times"     "algorithms"    "shapes"    "linetypes"     "colours"
1   0.000271833 "algo1"         "x"         "solid"         "blue"
11  0.000612195 "algo1"         "x"         "solid"         "blue"
1   0.000267802 "algo2"         "x"         "solid"         "red"
11  0.000644297 "algo2"         "x"         "solid"         "red"
1   0.000280468 "algo3"         "x"         "solid"         "green"
11  0.000816817 "algo3"         "x"         "solid"         "green"
1   0.000452015 "algo4"         "x"         "solid"         "black"
11  0.00271677  "algo4"         "x"         "solid"         "black"
1   0.000271255 "algo5"         "o"         "dashed"        "blue"
11  0.000622194 "algo5"         "o"         "dashed"        "blue"
1   0.000271107 "algo6"         "o"         "dashed"        "red"
11  0.000701686 "algo6"         "o"         "dashed"        "red"
1   0.000267631 "algo7"         "o"         "dashed"        "green"
11  0.000723341 "algo7"         "o"         "dashed"        "green"
1   0.000451016 "algo8"         "o"         "dashed"        "black"
11  0.00124079  "algo8"         "o"         "dashed"        "black"

Этот кадр данных содержит время выполнения для 8 различных алгоритмов. Я хотел бы добиться следующего: я хотел бы нанести точки крестами для алгоритмов с alg1 по alg4 и с точками (если возможно, заполненными) для алгоритмов с alg5 по alg8. Аналогичным образом я хочу, чтобы линии соединяли точки, чтобы нарисованные линии показывали рост времени выполнения каждого алгоритма, и я хочу, чтобы некоторые линии были сплошными, а другие — пунктирными. Я также хочу использовать определенные цвета для каждого алгоритма, как указано в столбце «цвета».

Теперь мне удалось добиться некоторого прогресса:

g <- ggplot(df, aes(x=n, y=times, group=algorithms, linetype=linetypes, pch=shapes, colour=colours)) +
    geom_line() +
    geom_point() +
    theme(legend.position="bottom") +
    xlab("n") +
    ylab(paste0("Execution time (ms)")) +
    ggtitle("asdf")

Но это дает мне очень неприятную легенду: введите здесь описание изображения

Я хотел бы иметь легенду с именами алгоритмов рядом с изображением их соответствующих типов линий и точек и, очевидно, цвета.

Я просмотрел этот сайт и другие, но безрезультатно. Это действительно было сложно, так как большинство людей не выходят за рамки ручной настройки цветов, форм точек и типов линий. Мне нужно только знать, как сделать этот дополнительный шаг. Я уверен, что это довольно легко сделать, но я в полной растерянности.

Спасибо вам всем.


person llualpu    schedule 30.10.2019    source источник
comment
Действительно, @dipetkov прибил это. Однако типы точек нуждались в дополнительной настройке. X и o больше не работали с их решением, поэтому я заменил их на 4 и 1 (x->4, o->1, см. sthda.com/english/wiki/ggplot2-point-shapes), и теперь все в порядке. Большое спасибо.   -  person llualpu    schedule 30.10.2019


Ответы (1)


Масштабы цвета/типа линии/формы можно указать вручную.


library("tidyverse")

df <- tibble::tribble(
  ~n, ~times, ~algorithms, ~shapes, ~linetypes, ~colours,
  1L, 0.000271833, "algo1", "x", "solid", "blue",
  11L, 0.000612195, "algo1", "x", "solid", "blue",
  1L, 0.000267802, "algo2", "x", "solid", "red",
  11L, 0.000644297, "algo2", "x", "solid", "red",
  1L, 0.000280468, "algo3", "x", "solid", "green",
  11L, 0.000816817, "algo3", "x", "solid", "green",
  1L, 0.000452015, "algo4", "x", "solid", "black",
  11L, 0.00271677, "algo4", "x", "solid", "black",
  1L, 0.000271255, "algo5", "o", "dashed", "blue",
  11L, 0.000622194, "algo5", "o", "dashed", "blue",
  1L, 0.000271107, "algo6", "o", "dashed", "red",
  11L, 0.000701686, "algo6", "o", "dashed", "red",
  1L, 0.000267631, "algo7", "o", "dashed", "green",
  11L, 0.000723341, "algo7", "o", "dashed", "green",
  1L, 0.000451016, "algo8", "o", "dashed", "black",
  11L, 0.00124079, "algo8", "o", "dashed", "black"
)

df %>%
  ggplot(aes(
    x = n, y = times,
    linetype = algorithms,
    shape = algorithms,
    colour = algorithms
  )) +
  geom_line() +
  # Comment out `geom_point` to check that the line type is 
  # as specified but is overplotted by the shape in the legend
  geom_point(size = 4) +
  xlab("n") +
  ylab(paste0("Execution time (ms)")) +
  ggtitle("asdf") +
  scale_color_manual(
    values = deframe(df %>% select(algorithms, colours))
  ) +
  scale_linetype_manual(
    values = deframe(df %>% select(algorithms, linetypes))
  ) +
  scale_shape_manual(
    values = deframe(df %>% select(algorithms, shapes))
  ) +
  theme(legend.position = "bottom")

Создано 30 октября 2019 г. с помощью пакета reprex (v0.3.0)

person dipetkov    schedule 30.10.2019