легенда неприятности в разбросе ggplot - PullRequest
6 голосов
/ 07 июня 2011

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

Я могу получить большинство того, что хочу, но у легенды есть следующие проблемы:

  • легенда показывает 2 строки для каждого типа линии, почему ?, как исправить?

  • Я бы предпочел, чтобы в прямоугольниках легенды не было розового фона (если я не укажуцвет заливки, тогда прямоугольник становится серым по умолчанию, что мне не нравится больше)

Пример кода:

set.seed(603)
x.raw=rnorm(n=30, mean=50, sd=20)
y.raw=x.raw+rnorm(n=30, mean=2, sd=2)
x.raw=round(x.raw, 2); y.raw=round(y.raw, 2)
df=data.frame(x=x.raw, y=y.raw)

require(ggplot2, quietly=TRUE)
theme_set(theme_bw())
xy.range=range(df$x, df$y)

p=ggplot(df, aes(x=x, y=y)) + 
geom_point(shape=ifelse(nrow(df)>49, 1, 16)) +
geom_smooth(method=lm, fill="red1", aes(colour="Fitted", linetype="Fitted")) +
geom_abline(intercept=0, slope=1, aes(colour="Ideal", linetype="Ideal")) +
scale_colour_manual(name="Lines", values=c("Ideal"="blue", "Fitted"="red")) +
scale_linetype_manual(name="Lines", 
                      values=c("Ideal"="solid", "Fitted"="twodash")) +
scale_x_continuous(name="Control", limits=xy.range) +
scale_y_continuous(name="Evaluation", limits=xy.range) +
opts(title="Method Comparison")
p

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

  • сделал geom_point последним, чтобы точки не перезаписывались
  • сохранял вызовы масштабирования непрерывными, так что ограничения по осям x и y вынужденыбудь то же самое
  • аналогичное примечание, добавлен аспект
    ggplot(df, aes(x=x, y=y)) +
        geom_smooth(method=lm, se=FALSE, size=1, aes(colour="Fitted", linetype="Fitted")) +
        geom_smooth(method=lm, fill="red", colour="red", linetype="twodash", size=1) +
        geom_line(data = data.frame(x=0, y=0), aes(colour = "Ideal", linetype = "Ideal"), size=1) +
        #geom_abline(intercept=0, slope=1, aes(colour = "Ideal", linetype = "Ideal"), size=0) +
        geom_abline(intercept=0, slope=1, colour = "blue", linetype = "solid", size=1) +
        geom_point(shape=ifelse(nrow(df)>49, 1, 16)) +
        scale_colour_manual(name="Lines", values=c("Ideal"="blue", "Fitted"="red")) +
        scale_linetype_manual(name="Lines", values=c("Ideal"="solid", "Fitted"="twodash")) +
        scale_x_continuous(name="Control", limits=xy.range) +
        scale_y_continuous(name="Evaluation", limits=xy.range) +
        opts(title="Method Comparison", aspect.ratio=1) +
        theme_bw() 
    

Ответы [ 3 ]

5 голосов
/ 07 июня 2011

Как отмечает @Iselzer в комментарии, две строки предназначены для abline и smooth.

Чтобы фон легенды имел белую заливку, вам нужно пометить ggplot какследует:

  • Создание слоя geom_smooth с заливкой, сопоставленной с цветом
  • Создание второго, почти идентичного, слоя geom_smooth, но на этот раз с белой заливкой, не сопоставленной с легендой:

Код:

p=ggplot(df, aes(x=x, y=y)) + 
    geom_point(shape=ifelse(nrow(df)>49, 1, 16)) +
    geom_smooth(method=lm, fill="white", aes(colour="Fitted", linetype="Fitted")) +
    geom_smooth(method=lm, fill="red") +
    geom_abline(intercept=0, slope=1, aes(colour="Ideal", linetype="Ideal")) +
    scale_colour_manual(name="Lines", values=c("Ideal"="blue", "Fitted"="red")) +
    scale_linetype_manual(name="Lines", values=c("Ideal"="solid", "Fitted"="twodash")) +
    opts(title="Method Comparison") +
    labs(x="Control", y="Evaluation") +
    theme_bw() 

Также обратите внимание, что вы можете немного упростить свой код, используя labs() для создания меток.Это означает, что вам не нужно воссоздавать весы.

enter image description here

2 голосов
/ 19 марта 2014

На самом деле, есть способ изменить это, не добавляя обходного обходного пути:

p + theme(legend.key = element_rect(color=NA, fill="white"))
0 голосов
/ 07 июня 2011

Вот мой пример использования кода Андри без двух строк в легенде

ggplot(df, aes(x=x, y=y)) + 
    geom_point(shape=ifelse(nrow(df)>49, 1, 16)) +
    geom_smooth(method=lm, fill="white", aes(colour="Fitted", linetype="Fitted")) +
    geom_smooth(method=lm, fill="red") +
    geom_abline(intercept=0, slope=1, colour = "blue", linetype = "solid" ) +
    geom_line(data = data.frame(x=0, y=0), aes(colour = "Ideal", linetype = "Ideal")) +
    scale_colour_manual(name="Lines", values=c("Ideal"="blue", "Fitted"="red")) +
    scale_linetype_manual(name="Lines", values=c("Ideal"="solid", "Fitted"="twodash")) +
    opts(title="Method Comparison") +
    labs(x="Control", y="Evaluation") +
    theme_bw()

Я надеюсь, что лучшее управление легендами в новой версии ggplot позволит избежать такого рода взлома.

...