#r #ggplot2 #legend
#r #ggplot2 #условные обозначения
Вопрос:
Всем привет и заранее спасибо,
Я пытаюсь, чтобы в моей легенде отображались заполненные фигуры, а не просто выделенные цветом (показано ниже):
Мой код выглядит следующим образом:
p.ch4 <- ggplot(ch4.data, aes(x=date, y=value, group = type,
fill=type, color=type))
geom_line()
geom_point(aes(shape=type), color = "black", size =4)
geom_point(aes(shape=type, color=type), size=3)
scale_shape_manual(values = c(21:24))
scale_fill_manual(values = c("darkorchid3","indianred3","dodgerblue3"))
scale_color_manual(values = c("darkorchid3","indianred3","dodgerblue3"))
annotate("rect", xmin=as.POSIXct("2017-11-09"), xmax=as.POSIXct("2018-04-09"),ymin=0,ymax=75,alpha=.25)
scale_y_continuous(sec.axis = sec_axis(~., name = expression(paste('Methane (', mu, 'M)'))))
labs(y = expression(paste('Methane (', mu, 'M)')), x = "", color = "", shape = "")
theme_linedraw(base_size = 18)
#theme(legend.position = "none")
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
strip.text = element_text(face = "bold"))
theme(axis.text = element_text(angle = 45, hjust = 1))
print(p.ch4)
Я понимаю, что проделал большую работу в отношении цветов точек данных, контуров и фигур, и я подумал, не в этом ли заключается моя проблема?
Для воспроизводимости, вот мой набор данных «ch4.data»:
> dput(ch4.data)
structure(list(type = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("SWI",
"4cm", "12cm"), class = "factor"), date = structure(c(1537167600,
1535266800, 1533279600, 1531292400, 1529305200, 1527318000, 1526713200,
1527231600, 1525762800, 1524294000, 1522825200, 1521356400, 1516089600,
1511596800, 1509606000, 1537340400, 1534575600, 1531119600, 1530255600,
1527663600, 1525071600, 1517212800, 1513756800, 1510300800, 1537167600,
1535094000, 1533020400, 1530946800, 1528873200, 1528441200, 1526713200,
1524898800, 1522393200, 1519545600, 1516435200, 1514361600, 1510992000
), class = c("POSIXct", "POSIXt"), tzone = ""), value = c(52.43,
40.37, 12.92, 5.12, 4.93, 2.4, 1.97, 3.07, 5.7, 3.56, 2.74, 0.67,
0.78, 0.48, 0.7, 0.3, 0.21, 4.11, 1.54, 4.86, 7.42, 3.62, 0.81,
0.37, 6.2, 9.14, 34.11, 57.83, 63.02, 63.56, 54.13, 42.92, 32.59,
23.23, 9.97, 5.62, 0.52), geochem = c("ch4", "ch4", "ch4", "ch4",
"ch4", "ch4", "ch4", "ch4", "ch4", "ch4", "ch4", "ch4", "ch4",
"ch4", "ch4", "ch4", "ch4", "ch4", "ch4", "ch4", "ch4", "ch4",
"ch4", "ch4", "ch4", "ch4", "ch4", "ch4", "ch4", "ch4", "ch4",
"ch4", "ch4", "ch4", "ch4", "ch4", "ch4")), row.names = c(NA,
-37L), class = "data.frame")
Спасибо!
Ответ №1:
Это может быть достигнуто следующим образом. Важным шагом было присвоить всем трем шкалам одинаковое название, чтобы легенды были объединены в одну:
Кстати: я также удалил второй слой geom_point и просто добавил черный цвет в качестве аргумента.
РЕДАКТИРОВАТЬ: Как правильно указал @chemdork123 в своем комментарии, проблему можно было бы проще решить, установив одинаковые метки для всех трех шкал в labs()
инструкции или отбросив пустые, т.е. ""
метки для шкал color
и shape
.
library(ggplot2)
ggplot(ch4.data, aes(x=date, y=value))
geom_line(aes(color=type))
geom_point(aes(shape=type, fill=type), color = "black", size=4)
scale_shape_manual(name = "type", values = c(21:23))
scale_fill_manual(name = "type", values = c("darkorchid3","indianred3","dodgerblue3"))
scale_color_manual(name = "type", values = c("darkorchid3","indianred3","dodgerblue3"))
annotate("rect", xmin=as.POSIXct("2017-11-09"), xmax=as.POSIXct("2018-04-09"),ymin=0,ymax=75,alpha=.25)
scale_y_continuous(sec.axis = sec_axis(~., name = expression(paste('Methane (', mu, 'M)'))))
labs(y = expression(paste('Methane (', mu, 'M)')), x = "", color = "", shape = "")
theme_linedraw(base_size = 18)
#theme(legend.position = "none")
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
strip.text = element_text(face = "bold"))
theme(axis.text = element_text(angle = 45, hjust = 1))
Создано 2020-08-24 пакетом reprex (версия 0.3.0)
Комментарии:
1. Той же идеей было бы добавить
fill=""
кlabs()
в коде операционной системы. Интересно, что включение пустых строк дляlabs()
, похоже, здесь не мешает, потому чтоscale_*
функции переопределяютlabs()
функции. Таким образом, независимо от того, что вы указали дляcolor=
,fill=
иshape=
внутриlabs()
, все они все равно будут помечены в соответствии сscale_*_manual()
, если вы укажете title там.2. @chemdork123 Спасибо. Это действительно была основная проблема с кодом. Я упустил это из виду.