• R语言
  • 请问如何在geom_density中添加图例。

各位大神,在看R in action时,试着以ggplot2做里面的图,在做geom_density时图例不好做,具体如下。
数据准备

library(tidyverse)
my_data <- as.data.frame(state.x77[,c('Murder','Population', 'Income', 'Illiteracy', 'Frost')])
fit <- lm(Murder ~ Population + Income + Illiteracy + Frost, data = my_data )
z <- rstudent(fit)
ww <- rnorm(length(z), mean = mean(z),sd = sd(z))

做图

ggplot(NULL, aes(x = z, y = ..density..)) + geom_histogram(color = 'black',fill = 'white', bins = 13) +
  geom_density(color = 'red', linetype = 2,lwd = 2) +
  geom_density(aes(x = ww), color = 'blue', linetype = 3,lwd = 2) 

这幅图添加不上图例。

将数据转为长数据。

my_data<- as.data.frame(cbind(z,ww))
my_data<-gather(my_data)
head(my_data)

再次做图

ggplot(my_data,aes(x=value))+  
  geom_histogram(data = filter(my_data,key=='z'),aes(y=..density..),bins =13,fill='white',col='black')+
  geom_density(aes(color=key,linetype = key), lwd = 2)

上面这幅图的问题是图例是方形的,应该是与geom_density有关,能不能改成颜色+线型的方式。

    maodao
    方法一不显示图例是因为你的数据不符合 tidy 格式。
    方法二修改图例,你可以试试:

    ggplot(my_data, aes(x = value)) +  
      geom_histogram(data = filter(my_data, key == 'z'), aes(y = ..density..), bins =13, fill = 'white', col = 'black')+
      stat_density(aes(color = key, linetype = key), geom = "line", position = "identity", lwd = 2)

    你写的代码看起来很紧,略显压抑,适当加点空格,看起来会轻松些。

      Liechi 多谢了大神。主要是我是0基础学R,对写代码还是不太适应。另外还有一个问题想请教大神,能不能给点建议。就是tidyverse包基本可以执行除统计之外的所需的基本功能,如数据清洗,探索和可视化。其所用的思想与基础有点不同,基本是自成一派。那对我这种刚学R的小白,是专心搞明白这个包。还是基础包的那些内容也要学习点。
      感觉看不同大神写的书,其解决问题的思路还是有很大区别的。每换一本书,特别是有名大神的书,就像换一种想法。还没学精,就有点很乱的感觉。

        maodao 你可以看看这篇文章。不过要小心管道中毒,所以也建议你看看益辉的这篇,算是先吃点解药。

        如果你的工作主要是数据分析,那建议你多翻翻极乐净土 (Tidyverse) 的工具箱,比较好的参考资料是 Hadley 的 r4ds。不过在熟悉了极乐净土那套后,建议你至少看一遍 base R 里的常规操作。其实我觉得除了 ggplot 确实非常方便外,对普通使用者来说,二者的区别其实不是很大(我用 R 做的都是些比较简单的工作,可能没有完全体会到极乐净土的奥义,所以建议你也多听听其他人的看法 )。

        maodao 安利一篇自己写的小丑文 https://segmentfault.com/a/1190000018448149
        介绍了各种 现在 tidy_* 流的奇技淫巧。tidyverse 整体是一个蛮不错的框架,其中内容非常丰富且生态完善,挑一些自己惯用的就行了。如果是工作了还是建议先学 tidyverse 再学 base R,如果没工作可以系统性地从 base R 和 RCpp开始

        maodao 感觉看不同大神写的书,其解决问题的思路还是有很大区别的。每换一本书,特别是有名大神的书,就像换一种想法。还没学精,就有点很乱的感觉。

        建议别看太多不同的书:就我的经验,书里的内容都大同小异,看三本书会花三倍的时间,但是却肯定得不到三倍的信息。找一本比较好的重点学习,然后多实践,效果会好些。注意别掉进“骑驴觅驴“和”骑驴不肯下”的陷阱就是了:)。