ggplot散点图中的传说问题

Posted

技术标签:

【中文标题】ggplot散点图中的传说问题【英文标题】:legend troubles in ggplot scatter plot 【发布时间】:2011-09-10 01:23:20 【问题描述】:

我想使用 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

非常感谢大家抽出宝贵时间回复。虽然有什么可行的逻辑,但我不会通过反复试验到达那里。我确实为 final 更改了一些代码:

将 geom_point 设置在最后,以免点被覆盖 保持对缩放的调用连续,以便 x 和 y 轴限制强制相同 类似的注释,添加 aspect.ratio=1,现在理想的直线以 45° 角从一个角落延伸到另一个角落,al la Cleveland

最终代码:

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() 

【问题讨论】:

一条是平滑的,一条是abline。至于如何修复 leyend,我会做的就是在实际情节中不做任何传说。然后伪造一些数据并使用 geom_line 用 leyend 绘制它。但这只是一种解决方法。 【参考方案1】:

实际上,有一种方法可以在不添加时髦的解决方法的情况下更改它:

p + theme(legend.key = element_rect(color=NA, fill="white"))

【讨论】:

【参考方案2】:

这是我使用 andrie 的代码,没有图例中的两行

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中更好的图例控制能够避免这种hack。

【讨论】:

【参考方案3】:

正如@Iselzer 在评论中指出的那样,这两行是ablinesmooth

要使图例背景填充白色,您必须按以下方式欺骗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() 创建标签来稍微简化您的代码。这意味着您不必重新创建音阶。

【讨论】:

以上是关于ggplot散点图中的传说问题的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化:ggplot2可视化分组散点图并使用geom_smooth函数在散点图图中为不同的散点簇添加对应的回归曲线并使用se参数设置拟合回归线的置信区间

R语言ggplot2可视化绘制散点图(scatter plot)使用gghighlight包突出高亮散点图中的特定数据点并添加文本标签(highlight and text annotation)

R语言ggplot2可视化绘制散点图(scatter plot)使用gghighlight包突出高亮散点图中的特定数据点并自定义添加彩色文本标签(color text annotation)

如何用R画折线图,散点图,平滑曲线图

【R语言】--- 散点图

返回在散点图中选择的数据点