Тип линии легенды в ggplot - PullRequest
0 голосов
/ 18 января 2019

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

    tibble::tribble(
      ~variable,           ~value,  ~bin,              ~ci,
  "Advanced HS", 302.097396142857, "FFD", 21.2978862705524,
  "Beginner HS", 394.264259996296, "FFD", 28.8027249069651,
     "Children", 379.642674397368, "FFD", 18.1482664147856,
       "Adults", 217.875580083333, "FFD", 2.38006646944708,
  "Advanced HS", 305.244904223809, "SFD", 15.5487255740993,
  "Beginner HS", 350.108404085185, "SFD", 28.6379128865829,
     "Children", 358.329722218421, "SFD", 12.6900032541364,
       "Adults", 228.522062813542, "SFD", 2.73230976574123,
  "Advanced HS", 484.181295019048,  "GD", 33.9933197272878,
  "Beginner HS", 960.745730144444,  "GD", 55.8118108393556,
     "Children", 676.158669963158,  "GD",  44.238558449867,
       "Adults", 259.127882341667,  "GD", 4.30648424130776,
  "Advanced HS", 702.136573061905,  "TT", 47.0883793662974,
  "Beginner HS", 1541.69112013704,  "TT", 84.3091269009313,
     "Children",  976.54035988421,  "TT", 60.0584639291095,
       "Adults",  318.08245218125,  "TT", 7.99092674935576
  )



mytheme <- theme_bw() + theme(axis.title = element_text(size = rel(2)),
                          strip.text = element_text(size = rel(2)),
                          legend.position = "bottom",
                          legend.key = element_blank(),
                          text = element_text(size = 28),
                          legend.text = element_text(size = 28), 
                          plot.margin = margin(20, 20, 20, 20),
                          axis.text.x = element_text(hjust = 0.5, vjust = 0.5, size = 35),
                          axis.text.y = element_text(hjust = 0.5, vjust = 0.5, size = 35),
                          strip.background = element_rect(fill = 'gray96'))


tiff("r.tiff", units="in", width=10, height=7, res=300)
                         ggplot(data = Figure_1) + 
                         mytheme  + scale_y_continuous(breaks = seq(0,2000, 500))+ 
                         aes(x = bin, y = value, group = variable, color = variable) + scale_x_discrete(limits = c ("FFD","SFD", "GD", "TT")) +
                         geom_errorbar(aes(ymin=value-ci, ymax=value+ci), width=.1) + 
                         geom_line(aes(group=variable, linetype = variable), size =2) + scale_linetype_manual(values=c("solid", "longdash", "dotdash", "dotted")) + 
                         theme(legend.title = element_blank()) +
                         guides(col = guide_legend(reverse = FALSE, override.aes = list(size=6))) +
                         xlab("") + 
                         ylab("Duration (ms)")
                         dev.off()

1 Ответ

0 голосов
/ 18 января 2019

Ваши типы линий, не отображаемые в легенде, представляют собой некоторую комбинацию

  1. слой geom_errorbar использует linetype = 'solid', который перерисовывается или перезаписывается (я не уверенкоторый) тип линии из слоя geom_line
  2. размер линий в легенде настолько велик, что тип линии не виден

Чтобы исправить (1), используйте show.legend=FALSE in geom_errobar

geom_errorbar(aes(ymin=value-ci, ymax=value+ci), width=.1, show.legend=FALSE)

На этом этапе это не будет иметь никакого видимого значения для получающегося изображения из-за второй проблемы (2): линии в легенде / месте для текста слишком великиотображение рисунка настолько мало, что даже одна точка фиолетовой пунктирной линии занимает все пространство, выделенное для него (нет места для отображения второй точки).

Чтобы исправить это, есть несколько вариантов, которые у вас будутвыбирать между на основе эстетики:

  • Если вы также измените свою линию guides на size=1 вместо size=6, вы по крайней мере увидите точечный и точечный штрих в легенде, но все равно не увидит разницу ставкиween тире-тире и сплошные типы линий, потому что снова пространство для отображения линии недостаточно велико для отображения шаблона.(плюс, учитывая масштаб всего остального на графике, я подозреваю, что size=1 было бы неприемлемо маленьким на готовом графике).
  • Вы можете + theme(legend.key.width=units(5, 'lines')) в комбинации с guides(..., size=2), чтобы сделать битлегенды, которая показывает линии шире (при этом все еще имеет достаточно толстые линии, чтобы видеть), чтобы показать достаточно повторения рисунка, но это отталкивает последний элемент легенды от размера вашего изображения (показано ниже)поэтому вам может потребоваться увеличить размер изображения (или уменьшить размер шрифта легенды), чтобы он соответствовал размеру.Примечание: по умолчанию legend.key.width равно unit(1.2, 'lines') в theme_bw(), поэтому я выбрал 5 методом проб и ошибок.

    enter image description here

    • Вы также можетеguides(lty = guide_legend(reverse = FALSE, override.aes = list(size=2), byrow=TRUE, ncol=2)), чтобы легенда была перенесена на две строки, хотя, возможно, вам следует придерживаться исходной вертикально ориентированной легенды в правой части графика.Заметьте, что мне пришлось изменить col= на lty= (в любом случае они являются комбинированной легендой) enter image description here
  • в качестве общего замечания, дляэта конкретная фигура, похоже, что цвет уже идентифицирует линии, поэтому, возможно, допустимо показывать только цвет на легенде и опускать тип линии (хотя тогда при печати черно-белого цвета их будет трудно различить, что может быть причинойВы вводите тип линии в первую очередь)

...