5

我有一组难以可视化的数据,但我认为添加一些点和线的 ECDF 可以解决问题。我能够以我想要的方式绘制事物;我的问题是正确着色。

我有以下代码,它将所有正确的线和点放在图上,但现在我想正确地为所有内容着色和标记。我仔细阅读了多篇文章并尝试了一百件事,但无法做到正确。我需要以不同的方式格式化我的数据吗?

我对传奇的看法是这样的:

  • 虚线 = b
  • 实线 = a
  • 红色 = s
  • 蓝色 = 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)

在此处输入图像描述 我正在绘制的数据的一些上下文:我有随机数据集(s)和确定性集(d);每个随机集都有数百个值,而确定性集只有一个值。所以在我的情节中,我将随机数据的分布(实线)和随机数据的平均值(点)与确定性值(虚线)进行比较。对于随机数据集和确定性数据集,都有两个“案例”(a)和(b)。我希望所有(a)和(b)数据共享相同的颜色。

这似乎使用 aes 和颜色/线型/几何映射应该很容易,但我无法弄清楚。

提前致谢。

4

2 回答 2

5

为了获得更好的传奇位置color=variablelinetype=variable内部aes()ggplot()和为geom_vline()- 所以会有一个传奇。然后geom_point()将 x 和 yaes()以及color="s.mean"and放在里面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))))

在此处输入图像描述

于 2013-06-11T05:55:47.850 回答
3

Didzis 得到了答案。我能够调整他的代码并得到我正在寻找的最终产品:

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. 当使用手动刻度覆盖事物时,您需要制作每个刻度之一,然后在需要时使用“指南”覆盖

再次感谢迪兹。另一个生命,得救了。

于 2013-06-12T15:22:04.657 回答