как указать цвет линий и точек в ecdf ggplot2

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

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

Мое видение легенды примерно так:

  • пунктирная линия = b
  • сплошная линия = а
  • красный = с
  • синий = d
  • точка = s.mean

код для создания примера графика находится здесь:

require(ggplot2)
require(reshape2)

s.a = rnorm(100)*100
s.b = rnorm(100)*100+50
d.a = -35
d.b = 20
sdata = data.frame(cbind(s.a,s.b))
ddata = data.frame(cbind(d.a,d.b))
sdata.m = melt(sdata)
ddata.m = melt(ddata)

ggplot(sdata.m, aes(x=value, color=variable)) +
  geom_vline(data=ddata.m,
             aes(xintercept = value,
                 color=variable),
             linetype = 2,
             size=2) + 
  stat_ecdf(size=1)+
  labs(title = 'plotTitle',
       color='colorLegendTitle') +
  xlab('xLabel') +
  ylab('yLabel')+
  theme_bw(30) +
  theme(
    legend.position=c(.8, .2),
    legend.box="horizontal",
    text=element_text(family="Times"),
    legend.key.size = unit(1,"cm")) +
  geom_point(x=mean(sdata.m$value[sdata.m$variable=="s.a"]),y=.5,
             size = 5) +
  geom_point(x=mean(sdata.m$value[sdata.m$variable=="s.b"]),y=.5,
             size = 5)

введите описание изображения здесьНекоторый контекст данных, которые я рисую: у меня есть наборы стохастических данных и детерминированные наборы (г); каждый стохастический набор будет иметь сотни значений, в то время как детерминированные наборы имеют только одно значение. Итак, на моем графике я сравниваю распределение стохастических данных (сплошные линии) и среднее стохастических данных (точки) с детерминированными значениями (пунктирные линии). Как для стохастического, так и для детерминированного наборов данных есть два «случая» (а) и (б). Я хочу, чтобы все данные (а) и (б) имели один и тот же цвет.

Кажется, это должно быть легко с сопоставлениями aes и color / linetype / geom, но я не могу этого понять.

Заранее спасибо.


person RyanStochastic    schedule 10.06.2013    source источник
comment
Итак, в приведенной выше таблице вы хотите, чтобы d.a и s.a были одного цвета, а d.b и s.b - одного цвета?   -  person SlowLearner    schedule 11.06.2013


Ответы (2)


Чтобы получить лучшую легенду, поместите color=variable и linetype=variable внутри aes() для ggplot() и geom_vline() - так будет одна легенда. Затем для geom_point() поместите x и y внутри aes(), а также color="s.mean" и linetype="s.mean". Это обеспечит добавление нового уровня в легенду. Теперь с scale_color"manual() и scale_linetype_manual() вы можете установить желаемые цвета и типы линий. С помощью guides() и override.aes= вы можете удалить точки из первых четырех записей.

ggplot(sdata.m, aes(x=value, color=variable,linetype=variable))+
  stat_ecdf(size=1)+
  geom_vline(data=ddata.m,
             aes(xintercept = value,color=variable,linetype=variable),
             size=2) +
  geom_point(aes(x=mean(sdata.m$value[sdata.m$variable=="s.a"]),
       color="s.mean",linetype="s.mean",y=.5),size = 5) +
  geom_point(aes(x=mean(sdata.m$value[sdata.m$variable=="s.b"]),
        color="s.mean",linetype="s.mean",y=.5),size = 5)+
  scale_color_manual(breaks=c("d.a","d.b","s.a","s.b","s.mean"),
                     values=c("blue","blue","red","red","green"))+
  scale_linetype_manual(breaks=c("d.a","d.b","s.a","s.b","s.mean"),
                     values=c(1,2,1,2,0))+
  guides(color=guide_legend(override.aes=list(shape=c(NA,NA,NA,NA,16))))

введите описание изображения здесь

person Didzis Elferts    schedule 11.06.2013
comment
Спасибо, Дидзис! Ниже я опубликовал окончательное решение со всеми деталями, которые я искал. Спасибо за код И объяснение. - person RyanStochastic; 12.06.2013

Дидзис получает признание за ответ; Мне удалось адаптировать его код и получить конечный продукт, который я искал:

ggplot(sdata.m, aes(x=value, color=variable,linetype=variable,shape=variable))+
  stat_ecdf(size=1)+
  geom_vline(data=ddata.m,
             aes(xintercept = value,color=variable,linetype=variable,shape=variable),
             size=2) +
  geom_point(aes(x=mean(sdata.m$value[sdata.m$variable=="s.a"]),
                 color="s.a.mean",linetype="s.a.mean",shape="s.a.mean",
                 y=.5),size = 5) +
  geom_point(aes(x=mean(sdata.m$value[sdata.m$variable=="s.b"]),
                 color="s.b.mean",linetype="s.b.mean",shape="s.b.mean",
                 y=.5),size = 5) +
  scale_shape_manual(breaks=c("d.a","d.b","s.a","s.a.mean","s.b","s.b.mean"),
                     values=c(16,16,16,16,16,16)) +
  scale_color_manual(breaks=c("d.a","d.b","s.a","s.a.mean","s.b","s.b.mean"),
                     values=c("blue","red","blue","blue","red","red"))+
  scale_linetype_manual(breaks=c("d.a","d.b","s.a","s.a.mean","s.b","s.b.mean"),
                        values=c(2,2,1,0,1,0))+
  guides(color=guide_legend(override.aes=list(shape=c(NA,NA,NA,16,NA,16))))

введите описание изображения здесьЯ узнал пару вещей:

  1. при добавлении разрывов / значений в scale_manual важен алфавитный порядок.
  2. когда все параметры (тип линии / форма / цвет) сопоставлены с одной и той же переменной, вы можете получить все в одной легенде
  3. при переопределении вещей с помощью ручных масштабов вам необходимо сделать по одному для каждого масштаба, а затем переопределить с помощью `` направляющих '', если это необходимо

Еще раз спасибо Didzis. Еще одна спасенная жизнь.

person RyanStochastic    schedule 12.06.2013