查看原文
其他

R软件画图指南针,摆脱丑图不是梦

可有偿投稿计量经济圈,计量相关则可

箱:econometrics666@sina.cn

编辑:计量经济圈; 来源:数据大表哥 公众号; 作者:大雄;感谢授权.

所有计量经济圈方法论丛的do文件, 微观数据库和各种软件都放在社群里.计量爱好者欢迎到社群交流访问.

计量经济圈引荐语:以下部分程序实战演练了R软件中ggplot2强大绘图功能中的部分function。ggplot2这个程序包,应该说在当今绘图界是数一数二的,图形种类很多而且设计巧妙。下面主要引荐了ggplot2绘制的条形图、散点图、折线图、数据描述、图形注释等功能。


1

绘制简单条形图


1数据

这里使用的数据是2017年中国各省和直辖区的贸易数据,整个文章的数据都是以此数据为基准作图。


数据来源:

http://www.sohu.com/a/219023205_480375


test_1

    区域   贸易总额

    天津   7646.9

    辽宁   5521.7

    河南   5232.8

    四川   4605.9

    重庆   4508.3

    广西   3866.3

    河北   3375.8

    安徽   3267.0

    湖北   3134.3

   陕西   2714.9

   湖南   2434.3

   江西   2138.6

   云南   1578.7

   新疆   1398.4

 黑龙江   1280.7

   山西   1162.0

   吉林   1149.9


注:贸易总额单位(亿元)


2方法

使用ggplot()函数和geom_bar(stat = 'identity')绘制简单的条形图,并分别指定X轴和Y轴对应的变量。


3代码

library(ggplot2)  #调用命令包

test_1 <-read.table("E:/公众号/GGPLOT2条形图/V5_ggplot2(条形图).csv",header = T,sep=",")  #调用数据

ggplot(data = test_1, mapping = aes(x = 区域, y = 贸易总额)) + geom_bar(stat= 'identity')   #绘制简单条形图


4图形



2

绘制彩虹(渐变)条形图


1数据

数据同上“test_1”。



2方法

相较于简单条形图多一个参数,将分类变量映射到fill参数。


3代码

library(ggplot2)  #调用命令包

test_1 <-read.table("E:/公众号/GGPLOT2条形图/V5_ggplot2(条形图).csv",header = T,sep=",")  #调用数据

ggplot(data = test_1, mapping = aes(x = 区域, y = 贸易总额,fill=区域)) + geom_bar(stat= 'identity')


4图形



3

绘制统一颜色条形图


1数据

数据同上“test_1”。


2方法

绘制统一颜色的条形图可用fill参数设置颜色,可通过colour参数设置条形图边框的颜色。


3代码

library(ggplot2)  #调用命令包

test_1 <-read.table("E:/公众号/GGPLOT2条形图/V5_ggplot2(条形图).csv",header = T,sep=",")  #调用数据

ggplot(data = test_1, mapping = aes(x = 区域, y = 贸易总额)) + geom_bar(stat= 'identity',fill = 'lightblue',colour = 'black')


注:关于颜色的更多设置可参考(https://blog.csdn.net/chang349276/article/details/77476848)。


4图形



4

绘制堆积条形图


1数据

 test_2

区域 贸易模式 贸易总额

    天津   进口额   4694.5

    天津   出口额   2952.4

    辽宁   进口额   3027.3

    辽宁   出口额   2494.4

    河南   进口额   2061.0

    河南   出口额   3171.8

    四川   进口额   2067.4

    四川   出口额   2538.5

    广西   进口额   2011.1

   广西   出口额   1855.2

   河北   进口额   1249.6

   河北   出口额   2126.2

   安徽   进口额   1380.6

   安徽   出口额   1886.4

   湖北   进口额   1070.2

   湖北   出口额   2064.1

   陕西   进口额   1055.1

   陕西   出口额   1659.8

   湖南   进口额    868.8

   湖南   出口额   1565.5

   江西   进口额    729.7

   江西   出口额   2138.6


注:注意数据结构的变化。


2方法

使用geom_bar()函数,并映射一个变量给填充参数(fill)即可。该代码与“统一颜色填充条形图”不同,这里引用的变量是“贸易模式”。


3代码

library(ggplot2)  #调用命令包

test_2 <-read.table("E:/公众号/GGPLOT2条形图/V6_ggplot2(簇状条形图).csv",header = T,sep=",")  #调用数据

ggplot(data = test_2, mapping = aes(x = 区域, y = 贸易总额,fill = 贸易模式)) + geom_bar(stat= 'identity')  #绘制堆积条形图


4图形





5

绘制百分比堆积条形图


1数据

数据同堆积条形图。


2方法

首先,通过plyr命令包中的ddply()函数和transform()函数将每组条形对应的数据标准为100%格式,之后,将计算得到结果绘制百分比堆积条形图。


3代码

绘制百分比条形图代码相较于前面4种条形图都复杂些。


library(plyr)  #为了使用ddply()函数

library(ggplot2)

PCT <- ddply(test_2,"区域",transform,percent_贸易总额 = 贸易总额 / sum(贸易总额) * 100)

ggplot(data = PCT, mapping = aes(x = 区域, y = percent_贸易总额,fill = 贸易模式)) + geom_bar(stat= 'identity')


4图形



6

绘制簇状条形图


1数据

数据同堆积条形图。


2方法

将分类变量映射到fill参数,并运行代码geom_bar(position = 'dodge')。


3代码

library(ggplot2)

ggplot(data = test_2, mapping = aes(x = 区域, y = 贸易总额,fill = 贸易模式)) + geom_bar(position = 'dodge',stat= 'identity')


4图形



现在基本的条形图都讲完了,接下来分享调整条形图细节的技术



7

调整条形宽度和间距


调整条形宽度

1数据

数据同上“test_1”。


2方法

通过设置geom_bar()函数的参数width可使条形变得更宽或者更窄。该参数的沉默值为0.9,更大的值将条形更宽,反之则更窄。


3代码

library(ggplot2)

ggplot(data = test_1, mapping = aes(x = 区域, y = 贸易总额,fill=区域)) + geom_bar(stat= 'identity',width = 0.5)


4图形


控制条形宽度的参数width = 0.5


控制条形宽度的参数width = 1


调整条形间距

5图形




实现代码:ggplot(data = test_2, mapping = aes(x = 区域, y = 贸易总额,fill = 贸易模式)) + geom_bar(position = position_dodge(1),width = 1,stat= 'identity')



实现代码:ggplot(data = test_2, mapping = aes(x = 区域, y = 贸易总额,fill = 贸易模式)) + geom_bar(position = position_dodge(0.7),width = 0.5,stat= 'identity')


6讨论

当position = position_dodge(0.7) > width = 0.5(0.7>0.5) 时,条形就会分离;当position = position_dodge(0.5) > width = 0.7(0.5<0.7) 时,条形就会重叠;当position = position_dodge(0.5) = width = 0.5(0.5=0.5) 时,条形图就恰好的结合;如果都等于‘1’那么效果如图5的第一幅图所示。


8

添加数据标签


1数据

数据同上“test_1”。


2方法

在绘制图代码中加上geom_text()即可添加数据标签,通过设置vjust竖直调整数据标签的位置。


3代码

ggplot(data = test_1, mapping = aes(x = 区域, y = 贸易总额)) + geom_bar(stat= 'identity') +  geom_text(aes(label = 贸易总额),vjust = 1.5,colour = 'white',size = 2.5)


4图形


size参数值控制字体大小



实现代码:ggplot(data = test_1, mapping = aes(x = 区域, y = 贸易总额)) + geom_bar(stat= 'identity') + 

  geom_text(aes(label = 贸易总额),vjust = -0.5,colour = 'black',size = 2.5)




实现代码:ggplot(data = ce, mapping = aes(x = 区域, y = 贸易总额,fill = 贸易模式)) + geom_bar(stat= 'identity') +

 geom_text(aes(y = label_y,label = 贸易总额),vjust = 1.5,colour = 'white',size = 2.5)



实现代码:ce <- ddply(test_5,'区域',transform,label_y = cumsum(贸易总额) - 0.5*贸易总额)

ggplot(data = ce, mapping = aes(x = 区域, y = 贸易总额,fill = 贸易模式)) + geom_bar(stat= 'identity') +

  geom_text(aes(y = label_y,label = paste(format(贸易总额,nsmall = 2),'亿元')),colour = 'white',size = 2.5)


5讨论

“label_y = cumsum(贸易总额) - 0.5*贸易总额”是标签位于中部的核心代码。


paste(format(贸易总额,nsmall = 2),'亿元')可在标签添加单位,nsmall = 2是保留两个小数点。


1

绘制正负值条形图


1数据

数据集来源于gcookbook包中climate数据集,创建一个对正负值进行标示的标量pos。


创建数据集:


> library(gcookbook) #为了使用数据集——climate

> Plus_minus <- subset(climate, Source == "Berkeley" & Year >= 1900)

> Plus_minus$pos <- Plus_minus$Anomaly10y >= 0


> Plus_minus

      Source    Year    Anomaly1y  Anomaly5y Anomaly10y Unc10y   pos

121 Berkeley 1920     NA             NA         -0.193                0.097     FALSE

122 Berkeley 1921     NA             NA         -0.167                0.098     FALSE

123 Berkeley 1922      NA             NA         -0.128               0.096     FALSE

124 Berkeley 1923      NA             NA         -0.075               0.097     FALSE

.........

178 Berkeley 1977       NA            NA          0.158              0.012      TRUE

179 Berkeley 1978       NA            NA          0.167              0.013      TRUE

180 Berkeley 1979       NA            NA          0.193              0.012      TRUE

181 Berkeley 1980       NA            NA          0.186              0.016      TRUE


2方法

数据集准备完毕后,将pos映射给颜色填充参数fill()。

注意:这里将条形图的参数设定为position = "identity",可避免系统因对负值绘制堆积条形图而发出警告信息。


3代码

> library(gcookbook) #为了使用数据集——climate

> library(ggplot2)

> Plus_minus <- subset(climate, Source == "Berkeley" & Year >= 1900)

> ggplot(Plus_minus, aes(x = Year, y = Anomaly10y, fill = pos)) + geom_bar(stat = "identity", position = "identity")


4图形




6讨论

本图绘制年份的代码为:Year >= 1920 & Year <= 1980。

通常红色表示正直,绿色表示负值。

本图图例没有真正的含义扰乱视觉。


可以通过参数scale_fill_manual()对条形图颜色调整。

可以通过参数guide = FALSE删除图例。

可以通过参数colour()和size()分别控制条形边框的颜色和边框线的尺寸,单位是毫米。


> ggplot(Plus_minus, aes(x = Year, y = Anomaly10y, fill = 

pos)) + geom_bar(stat = "identity", position = "identity", 

colour = "black", size = 0.08) +  scale_fill_manual(values = 

c("springgreen1","tomato1"), guide = FALSE)




2

绘制火柴条形图


1数据

 创建数据集:

> library(gcookbook) #为了使用数据集——climate

> library(ggplot2)

> tophit <- tophitters2001[1:25, ] #取出toohitters数据集的前25行


> tophit

                id   first        last            name               year 

1  walkela01   Larry      Walker     Larry Walker    2001     

2  suzukic01   Ichiro     Suzuki      Ichiro Suzuki     2001     

3  giambja01  Jason     Giambi     Jason Giambi   2001     

4  alomaro01 Roberto  Alomar    Roberto Alomar 2001   

...........


2方法


3代码

> library(gcookbook) #为了使用数据集——climate

> library(ggplot2)

> tophit <- tophitters2001[1:25, ] #取出toohitters数据集的前25行

 #火柴图

> ggplot(tophit, aes(x = avg, y = name)) + geom_segment

(aes(yend = name), xend = 0, colour = "grey50") +

   geom_point(size = 3, aes(colour = lg)) +

   scale_colour_brewer(palette = "Set1", limits =

 c("NL", "AL"), guide = FALSE) +

 >  theme_bw() +

 >  theme(panel.grid.major.y = element_blank()) +

   facet_grid(lg ~ ., scales = "free_y", space = "free_y")



4图形



6讨论

geom_segment:可以添加直线。

geom_point:可以添加点。

scale_colour_brewer:离散数据的颜色标度。用参数paletee = "调色板名称";参数limits = c("NL", "AL")中的因子是对应调色板颜色。


注:scale_colour_brewer(palette = "Set1", limits =

 c( "AL", "NL"), guide = FALSE) 只要将因子顺序颠换,点的颜色就不同。


panel.grid.major.y = element_blank():删除水平网格线。

theme()的详细用法可参考(http://www.sohu.com/a/224303554_466874) 。

facet_grid()分面设置。其中facet_wrap和facet_grid不同在于facet_wrap是基于一个因子进行设置,facets表示形式为:~变量(~单元格) ,而facet_grid是基于两个因子进行设置,facets表示形式为:变量~变量(行~列),如果把一个因子用点表示,也可以达到facet_wrap的效果,也可以用加号设置成两个以上变量。

例如:变量+变量~变量 的形式,表示对三个变量设置分面。

scales参数fixed表示固定坐标轴刻度,free表示反馈坐标轴刻度,也可以单独设置成free_x或free_y。

facet_grid()分面设置更多知识参考(https://www.cnblogs.com/wkslearner/p/5715095.html)  。

折线图通常用来对两个连续变量之间的相互依存关系进行可视化,其中x轴对应于自变量(一般来说,折线图的x轴对应的是时间变量),y轴对应于因变量。


1

绘制简单折线图


1数据

BOD数据集来源于ggplot2功能包


> BOD


  Time  demand

    1     8.3

    2     10.3

    3     19.0

    4     16.0

    5     15.6

    7     19.8


2方法

运行ggplot()和geom_line()函数,并分别将Time和demand映射到X轴和Y轴。


3代码

> library(ggplot2)

> ggplot(BOD, aes(x = Time, y = demand)) + geom_line()


4图形




5讨论

本图绘制的X轴没有把Time变量的1~7都呈现出来,方法是将Time变量转化为因子型变量。


当x对应于因子型变量是,必须使用命令aes(group = 1)以确保ggplot()知道这些数据点属于同一个分组,从而应该用一条线连在一起。


> BOD_1 <- BOD   #将数据复制一份

> BOD_1$Time <- factor(BOD_1$Time)

> ggplot(BOD_1, aes(x = Time, y = demand, group =1)) + geom_line()




这里还有俩个问题:一是x轴没有6这个水平,二是y轴起点为“0”更合适。


可以运行ylim()设定y轴范围或者运行另一个参数expand_limit()拓展y轴的范围。


> ggplot(BOD, aes(x = Time, y = demand)) + geom_

line() + ylim(0, max(BOD$demand))

#下述代码与上述代码同等功能

> ggplot(BOD, aes(x = Time, y = demand)) + geom_

line() + expand_limits(y = 0)





2

绘制多重折线图


1数据

 创建数据集:

> library(plyr) 

#载入plyr包便于我们使用ddply()函数创建数据集

> tg <- ddply(ToothGrowth, c('supp', 'dose'), summarise, length = mean(len))

#对ToothGrowth数据集进行汇总


> head(ToothGrowth)


    len supp dose

    4.2    VC  0.5

   11.5   VC  0.5

   7.3     VC  0.5

   5.8     VC  0.5

   6.4     VC  0.5

   10.0   VC  0.5


> tg


   supp dose length

   OJ  0.5  13.23

   OJ  1.0  22.70

   OJ  2.0  26.06

   VC  0.5   7.98

   VC  1.0  16.77

   VC  2.0  26.14



2方法


3代码

> library(plyr)

> library(ggplot2)

>ggplot(tg, aes(x = dose, y = length, colour = supp)) + geom_line()

#将supp映射给颜色(colour) 

> ggplot(tg, aes(x = dose, y = length, linetype = supp)) + geom_line()

#将supp映射给线型(linetype) 



4图形




#将supp映射给颜色



#将supp映射给线型


5讨论

关于ddply()函数的解读:

第一个参数是要操作的原始数据集,比如:ToothGrowth

第二个参数是按照某个(也可以几个)变量,对数据集分割,比如按照'supp'和'dose'对数据集分割。

第三个参数是具体执行操作的函数,对分割后的每一个子数据集,调用该函数。

第四个参数可选,表示第三个参数对应函数所需的额外参数。


3

修改线条样式


1数据

同“绘制简单折线图”和“绘制多重折线图”


2方法

通过设置线型(linetype)、线宽(size)和颜色(colour)参数可以分别修改折线的线型、线宽和颜色。


3代码

> library(ggplot2)

> ggplot(BOD, aes(x = Time, y = demand)) + geom_line(

linetype = 'dashed', size = 1.2 , colour = 'springgreen1')

#绘制单折线图


> library(ggplot2)

> library(plyr)

> ggplot(tg, aes(x = dose, y = length, colour = supp)) +  

        geom_line(linetype = 'dashed') 

#绘制多重折线图


4图形


#绘制单折线图



#绘制多重折线图


4

修改数据标记样式


1数据

同“绘制简单折线图”和“绘制多重折线图”


2方法

在函数aes()函数外部设定函数geom_point()的大小(size)、颜色(colour)和填充色(fill)即可。


4代码

> library(ggplot2)

> ggplot(BOD, aes(x = Time, y = demand)) + 

        geom_line(size = 1) +

        geom_point(size = 4, shape = 21,  fill = 'white')

#或者

> ggplot(BOD, aes(x = Time, y = demand)) + 

   geom_line(size = 1) +

    geom_point(size = 4, shape = 21,  fill = 'white')


4图形





5讨论

对于多重折线图的着色一般采用调色板,scale_colour_brewer()函数和scale_colour_manual函数完成。


> library(plyr) 

#载入plyr包便于我们使用ddply()函数创建数据集

> tg <- ddply(ToothGrowth, c('supp', 'dose'), summarise, length = mean(len))

#对ToothGrowth数据集进行汇总


> pd <- position_dodge(0.2)

#保存错开多重折线的距离


> ggplot(tg, aes(x = dose, y = length, fill = supp)) + 

        geom_line(position = pd) +

        geom_point(shape = 21, size = 3, position = pd) +

        scale_fill_manual(values = c('black', 'white'))


#或者

> ggplot(tg, aes(x = dose, y = length, fill = supp)) +

        geom_line(linetype = 'dashed',position = pd) +

        geom_point(shape = 21, size = 3, position = pd) + scale_fill_manual(values = c("springgreen1","tomato1"))



#再者

> ggplot(tg, aes(x = dose, y = length, fill = supp)) +

        geom_line(position = pd) +

        geom_point(size = 4, shape = 21, position = pd)



1

绘制简单散点图


1数据

使用gcookbook包中的heightweight数据集。

它是个多列数据,此图只利用ageYear和heightIn两列。


> library(gcookbook)

> head(heightweight[, c('ageYear', 

        'heightIn')])


 ageYear heightIn

   11.92     56.3

   12.92     62.3

   12.75     63.3

   13.42     59.0

   15.92     62.5

   14.25     62.5

  


2方法

运行geom_point()函数即可绘制散点图。


3代码

> library(ggplot2)

> library(gcookbook)

> ggplot(heightweight, aes(x = ageYear, 

        y = heightIn)) + 

        geom_point()


4图形



5讨论

可以通过点形参数shape绘制不同的点的形状,对于绘制分组散点图很有实用价值。



这是R的“plot symbols”。

点形1-20的点的颜色,包括实心区域的颜色都可有colour参数控制。

对于点形21-25而言,边框线和实心区域的颜色分别由colour和fill参数来控制。



2

绘制分组散点图


1数据

使用gcookbook包中的heightweight数据集。它是个多列数据,此图只利用ageYear,heightIn和sex三列。


> library(gcookbook) 

> head(heightweight

        [, c('ageYear', 'heightIn', 'sex')])


ageYear heightIn sex

   11.92     56.3       f

   12.92     62.3       f

   12.75     63.3       f

   13.42     59.0       f

   15.92     62.5       f

   14.25     62.5       f


2方法

将分组变量映射给点形(shape)和颜色(colour)属性。


4代码

> library(gcookbook)

> library(ggplot2)

> ggplot(heightweight, aes(x = ageYear, 

        y = heightIn, 

        colour = sex)) + geom_point()


4图形




5讨论

上图是通过将变量sex映射给colour,也可以将sex变量映射给参数shape。


> ggplot(heightweight, aes(x = ageYear, 

        y = heightIn, shape = sex)) + 

        geom_point()


散点图如下:




也可以进一步将不同点形和颜色结合起来绘制分组散点图。


> ggplot(heightweight, aes(x = ageYear, 

        y = heightIn, 

        shape = sex, colour = sex)) + 

        geom_point(size = 3)


散点图如下:



当然我们的渴望没有止于此,通过调用scale_shape_manual()函数可以使用其他点形。通过调用scale_colour_manual()函数可以调用其他调色板。


> ggplot(heightweight, aes(x = ageYear, 

   y = heightIn, 

  shape = sex, colour = sex)) + 

  geom_point(size = 2) +

  scale_shape_manual(values = c(1, 2)) +

  scale_colour_brewer(palette = 'Set1')


散点图如下:





3

将连续变量映射到点的颜色或大小属性上


1数据

使用gcookbook包中的heightweight数据集。它是个多列数据,此图只利用ageYear,heightI,weightLb和sex四列。


> library(gcookbook)

> head(heightweight[, c('ageYear', 

        'heightIn', 'sex', 'weightLb')])


 ageYear heightIn sex weightLb

   11.92     56.3   f     85.0

   12.92     62.3   f    105.0

   12.75     63.3   f    108.0

   13.42     59.0   f     92.0

   15.92     62.5   f    112.5

   14.25     62.5   f    112.0


2方法

在“绘制简单散点图”刻画了两个连续变量ageYear和heightIn的关系。如果要表示第三个连续变量weightLb,必须将其映射给其他的图形属性,例如colour和size。


3代码

> library(ggplot2)

> library(gcookbook)

> ggplot(heightweight, aes(x = ageYear, 

        y = heightIn, 

        colour = weightLb)) + 

        geom_point(size = 3)


4图形





5讨论

据研究“人类对于感知空间位置的微小变化很擅长”,因此将weightIn映射给size参数。


> ggplot(heightweight, aes(x = ageYear, 

        y = heightIn, 

        size = weightLb)) + 

        geom_point()


散点图如下:



依然我们的渴望没有止于此,我们将四个变量(sex、ageYear,heightIn、weightLb)可视化集于一图(将“高、富、帅、贱”集于一身)。


将weightLb映射给size参数,同时将sex映射给colour参数;调用scale_size_area()函数使数据点的面积正于变量值,同时调用调色板使图形更吸引眼球。


代码如下:


> ggplot(heightweight, aes(x = ageYear, 

        y = heightIn, size =   weightLb, 

        colour = sex)) + 

       geom_point(alpha = 0.5) +

       scale_colour_brewer(palette = 'Set1')


散点图如下:



宝宝们是不是看起来有种“吃货”的冲动。



4

处理图像重叠


1数据

使用diamonds数据集,它存在于tibble包中。


tibble包是一个轻量级的包,它实现的data.frame的重新塑造,保留了data.frame中经过实践证明有效的部分,吸取了专注于数据操作的dplyr包的基本思想。tibble包提供了更优于data.frame的性能,包括:打印,提取子集和因子操作。

参考网址:

http://www.bubuko.com/infodetail-1734674.html


> head(diamonds[, c('carat', 'price')])


# A tibble: 6 × 2

  carat price

  <dbl> <int>

  0.23   326

  0.21   326

  0.23   327

  0.29   334

  0.31   335

  0.24   336


2方法

略。


3代码

> library(ggplot2)

> sp <- ggplot(diamonds, 

        aes(x = carat, y = price))

> sp + geom_point()


4图形



5讨论

上图包含54000个数据点,数据点相互重叠严重,很难辩清图形中不同区域的数据点的相对密度。


第一个解决方案是通过设定alpha参数完成。

第二个解决方案是将数据点分箱(bin)并以矩形来表示。


先看第一种方案代码:


> library(ggplot2)

> sp <- ggplot(diamonds, 

        aes(x = carat, y = price))

> sp + geom_point(alpha = 0.1)  

#  设置数据点为90%的透明度。


散点图如下:



可以从图中看到变量carat的取值为整数区域以及“0.5”的区域有很多的垂直带,说明人们通常按这些尺寸切割钻石。


不过效果不理想,进一步调整数据点的透明度。


> library(ggplot2)

> sp <- ggplot(diamonds, aes(x = carat, 

        y = price))

> sp + geom_point(alpha = 0.01)

#  设置数据点为99%的透明度。


散点图如下:




由于数据点过于致密,即使在数据点透明度99%的情况下,图中大部分区域为实心的黑色,且数据点分布依然相当模糊。因此我们采取第二个方案。


方案代码如下:


> library(ggplot2)

> sp <- ggplot(diamonds, 

        aes(x = carat,  y = price))

> sp + stat_bin2d()

# 在默认的情况下stat_bin2d()函数分别在x抽和y抽方向上将数据分割为30组,总计900个箱子,


图形如下:



从图中看到左下方的数据点密度最大,这就意味着大多数钻石都是比较小且是廉价的。


进一步优化“分箱散点图”,使其数据点的颜色跟容易区分。我们将箱组数设定为bin = 50,再通过scale_fill_gradient()函数重新定义数据点的颜色,并指定颜色的最小色阶low和最大色阶high参数。


> sp + stat_bin2d(bins = 50) + 

       scale_fill_gradient(low = 'lightblue',

       high = 'red', 

       limits = c(0, 6000))

# limits将色度范围设定为0到6000。



上面是以矩形分箱的数据点,宝宝们也可以调用stat_binhex()函数换成六边形的代替。但是此函数在hexbin包里面。因此:


> install.packges("hexbin")

> library(hexbin)

> sp <- ggplot(diamonds, 

        aes(x = carat,  y = price))

> sp + stat_binhex(bins = 50) + 

        scale_fill_gradient(low = 'lightblue', 

        high = 'red', 

        limits = c(0, 8000))



好了,在这幅美丽图形引导下宝宝们可以看清楚大部分钻石尺寸和价格分布在哪个区域了。


下面我们一起探讨给散点图添加边际毛毯和文本标签。



5

绘制边际地毯散点图


1数据

使用R内置数据集faithful,该数据集包含两列关于“老忠实喷泉”的信息。

变量eruptions记录喷泉每次喷发的时长。

变量waiting记录两次喷发之间的时间间隔。


> head(faithful)


  eruptions waiting

     3.600      79

     1.800      54

     3.333      74

     2.283      62

     4.533      85

     2.883      55


2方法

调用geom_rug函数即可。


3代码

> library(ggplot2)

> ggplot(faithful, 

        aes(x = eruptions, y = waiting)) +

        geom_point() +

        geom_rug()


4图形




5讨论

边际地毯图本质上是一个一维的散点图,它用于展示每个坐标轴上数据分布的情况。


因为边际地毯线重叠严重,我们可以通过向边际地毯线的位置坐标添加扰动,还可以设定size减小线宽共同减轻地毯线的重叠程度。


> library(ggplot2)

> ggplot(faithful, aes(x = eruptions, 

       y = waiting)) +

      geom_point() +

      geom_rug(position = 'jitter', size = 0.2)


图形如下:





6

绘制标签散点图


1数据

使用countries数据集。该数据集是收集各国医疗保健支出情况。


> library(gcookbook) # 为了使用数据集

> head(subset(countries, Year == 2009 & 

        healthexp > 2000))


          Name    Code Year    GDP      laborrate  ....

254   Andorra   AND 2009    NA           NA        ....

560   Australia  AUS 2009   42130.82      65.2  ....

611    Austria    AUT 2009   45555.43      60.4  ....

968    Belgium  BEL  2009   43640.20      53.5  ....

1733  Canada   CAN  2009  39599.04      67.8 .... 

2702  Denmark  DNK 2009  55933.35      65.4 ....


2方法

调用annotate()函数或者geom_text()函数可以添加一个或多个数据点标签。

为了方便操作,选取人均支出大于2000美元的国家的数据子集。对各国医疗保健支出与每千新生儿的婴儿死亡率之间的关系进行可视化。

3代码

> library(ggplot2)

> sp <- ggplot(subset(countries, 

      Year == 2009 & healthexp > 2000), 

      aes(x = healthexp, y = infmortality)) + 

      geom_point()

> sp + annotate("text", x = 4350, y = 5.4, 

        label = "Canada")  + 

        annotate("text", x = 7400, y = 6.3, 

        label = "USA")


4图形



5讨论

上图控制的标签的量,也可以将全部的标签显示在图行中。


> sp + geom_text(aes(label = Name),

     size = 4)

# 在geom_text()函数中只需将映射一个因子型或字符串型的向量给参数label即可。一般size默认值是“5”。



很明显标签过于拥挤。

设定vjust = 0时,标签文本的基线会与数据点对齐;设定vjust=1时,标签的顶部会与数据点对齐。

也可以通过对Y的映射增加或者减小一个值得到相同的结果。


> sp + geom_text(

        aes(y = infmortality + 0.1,

        label = Name), size = 4, vjust = 0)



有时候标签不一定要上下摆放,要求是左右摆放。

要左对齐设定hjust = 0,要右对齐设定hjust = 1。

也可以通过对X的映射增加或者减小一个值得到相同的结果。


> sp + geom_text(aes(x = healthexp + 100, 

        label = Name),  size = 4, hjust = 0)




宝宝们看到一个惨不忍睹的问题:就是标签太多没有很好的可视化解决办法。

因此我们要越挫越勇,使用一些“巧妙的办法":只给感兴趣的国家添加标签。


方案是:先将数据集复制一份,并将Name列复制为Namel。再用%in%运算符找出绘制图形时希望保留的标签所在的位置。

关于%in%的更多用法参考:https://blog.csdn.net/baidu_34604003/article/details/52264362


> cdat <- subset(countries, Year == 2009 & 

        healthexp > 2000)

> cdat$Namel <- cdat$Name

> idx <- cdat$Namel %in% c("Canada",

         'Ireland', 'United  Kingdom', 

        'United States',  'New Zealand',

         'Iceland', 'Japan', 'Luxembourg',

         'Netherlands', 'Switzerland')

> idx

 [1] FALSE FALSE FALSE FALSE  TRUE 

 [6] FALSE FALSE FALSE FALSE FALSE  

 [11] TRUE  TRUE FALSE  TRUE  TRUE FALSE

 [17]  TRUE  TRUE FALSE FALSE FALSE

 [22] FALSE FALSE FALSE TRUE  TRUE  TRUE


> cdat$Namel[!idx] <- NA

# 根据上面的逻辑向量用NA重写变量Namel中的其他值。

> head(cdat[, c('Name', 'Year', 'Namel')])


          Name    Year  Namel

254    Andorra 2009   <NA>

560    Australia 2009   <NA>

611    Austria   2009    <NA>

968    Belgium 2009   <NA>

1733  Canada   2009   Canada

2702  Denmark 2009  <NA>


万事俱备,只欠图形代码。


> library(ggplot2)

> ggplot(cdat, aes(x = healthexp, 

       y = infmortality)) + 

      geom_point() + 

      geom_text(aes(x = healthexp + 100, 

      label = Namel), 

      size = 4, hjust = 0) +

      xlim(2000, 10000)


图形如下:



目的达到!接下来和宝宝们制作气泡图,气泡图是散点图的变种。



7

绘制气泡图


1数据

使用countries数据集。该数据集是收集各国医疗保健支出情况。


> library(gcookbook) # 为了使用数据集

> cdat2 <- subset(countries, Year == 2009 

    & Name %in% c("Canada", 'Ireland',

    'United Kingdom', 'United States', 

    'New Zealand', 'Iceland', 'Japan',

    'Luxembourg','Netherlands', 

    'Switzerland'))


>head(cdat2[, c('healthexp', 'infmortality',

             'GDP')])


     healthexp infmortality       GDP

1733  4379.761          5.2  39599.04

4436  3130.391          1.7  37972.24

4691  4951.845          3.4  49737.93

4946  3321.466          2.4  39456.44

5864  8182.855          2.2 106252.24

7088  5163.740          3.8  48068.35


2方法

调用geom_point()和scale_size_area()函数即可绘制气泡图。

我们将GDP映射给点的面积,将变量值的大小与气泡的大小成正比例,通过scale_size_area()函数完成。


3代码

> library(ggplot2)

> p <- ggplot(cdat2, aes(x = healthexp, 

        y = infmortality, size = GDP)) +

        geom_point(shape = 21, 

        colour = 'deepskyblue4',  

        fill = 'cyan3', alpha = 0.5)

> p + scale_size_area(max_size = 15)


4图形




5讨论

我们也可以将气泡图像散点图一样添加标签。


> p + scale_size_area(max_size = 15) +

        geom_text(aes(x = healthexp, 

        label = Name), size = 3, 

        vjust = -1.8, hjust = -0.1)




宝宝们立马发现最大气泡的标签不完整,关于这个问题会在后面章节——“控制图形的整体外观”专门讲解。


在一般情况下散点总和“回归拟合线”放在一起,二者形影不离。下面就分享在散点中添加拟合线。



8

添加回归模型拟合线


1数据

使用heightweight数据集。该数据集位于gcookbook包中。


2方法

运行stat_smooth()函数并设定method = lm即可向散点图添加线性回归拟合线。

在默认的情况下,stat_smooth()函数会给回归拟合线添加95%的置信域。置信域的水平可以通过设置level参数调整。

通过设定se = FALSE,系统不会给回归拟合线添加置信域。


3代码

> library(ggplot2)

> library(gcookbook)

> sp <- ggplot(heightweight, 

        aes(x = ageYear, y = heightIn))

> sp + geom_point() + 

        stat_smooth(method = lm)


4图形




5讨论

添加99%的置信域。


> sp + geom_point() + 

        stat_smooth(method = lm, 

        level = 0.99)



拟合线默认是蓝色的,我们可以colour(拟合线颜色和散点颜色),linetype(拟合线线型)、size(拟合线粗细)达到个性化设置。


> sp + geom_point(colour = 'grey60') +

      stat_smooth(method = lm, 

      se = F,  colour = 'black', 

      linetype = 2, size = 1.5)




众所周知线性模型并不是唯一对数据进行拟合的模型。在不对stat_smooth()函数不进行拟合模型指定时,系统会默认给出局部加权多项式拟合曲线。

运行sp + geom_point(colour = 'grey60') + stat_smooth()会给出正确的图形:


但同时系统会报错:`geom_smooth()` using method = 'loess'

因此避免系统报错请各位宝宝使用规范的代码。


> sp + geom_point(colour = 'grey60') +

        stat_smooth(method = loess)

这两行代码运行的效果图同上图。


1

绘制简单直方图


1数据

使用R内置数据集faithful,该数据集包含两列关于“老忠实喷泉”的信息。

变量eruptions记录喷泉每次喷发的时长。

变量waiting记录两次喷发之间的时间间隔。


> head(faithful)


  eruptions waiting

     3.600      79

     1.800      54

     3.333      74

     2.283      62

     4.533      85

     2.883      55


2方法

运行geom_histogram函数即可绘制直方图。


3代码

> library(ggplot2)

>  ggplot(faithful, aes(x = waiting)) +

          geom_histogram()

# 如果不指定参数binwidth控制直方图组距,系统会报错。

但不影响正常绘制图形。


4图形




5讨论

在沉默情况下数据被分割为30组,有可能分组太过精细或者太过粗糙,应根据数据实际情况来划分数据。

再者不指定参数binwidth系统还会报错。

我们通过设置binwidth来调整分组数目。


# 设定组距为5

> ggplot(faithful, aes(x = waiting)) +

      geom_histogram(binwidth = 5

      fill = 'white', colour = 'black')



也可以将x数值划分为15组


# 将X取值分为15组

> binsize <- diff(range(faithful$waiting)) / 15

# diff()用来获取相邻两项的差

# range()用来求的是极差即最大值减最小值

# 也可以设置为“18/10....”一定范围内的任何数值都可以


> ggplot(faithful, aes(x = waiting)) +

      geom_histogram(binwidth = binsize

      fill = 'white', colour = 'black')



解决了单组变量的直方图,再看变量分组的直方图怎样绘制?



2

绘制分组直方图


1数据

使用MASS包中的birthwt数据集,该数据集包括的是关于婴儿出生体重及一系列导致出生体重过低的危急因子的数据。


> library(MASS) 

> head(birthwt)

   low age lwt race smoke ptl ht ui ftv  bwt

   0  19 182    2     0   0  0  1   0  2523

   0  33 155    3     0   0  0  0   3  2551

   0  20 105    1     1   0  0  0   1  2557

   0  21 108    1     1   0  0  1   2  2594

   0  18 107    1     1   0  0  1   0  2600

   0  21 124    3     0   0  0  0   0  2622


2方法

要使用facet_grid()函数进行分面设置,其他同上。


3代码

> library(ggplot2)

> library(MASS) 

> ggplot(birthwt, aes(x = bwt)) +

      geom_histogram(fill = 'white', 

       colour = 'black') +

      facet_grid(smoke ~ .)

# 此代码中geom_histogram()函数中不能设置binwidth参数


4图形




5讨论

我们看到分面标签中是0和1,这显然不是我们想要的标签。

就解决方案是:赋值smoke变量新的标签。


#复制一个数据副本

> birthwt1 <- birthwt

# 将smoke转化成因子

birthwt1$smoke <- factor(birthwt1$smoke)

> levels(birthwt1$smoke)


# 修改“0”和“1”的标签

# 使用plyr包中的revalue()函数 将“0”和“1”

# 改为“No smoke”和“Smoke”


> library(plyr) 

# 为了使用revalue()函数

> birthwt1$smoke <- revalue(birthwt1$smoke, 

        c('0' = 'No Smoke', '1' = 'Smoke'))


> ggplot(birthwt1, aes(x = bwt)) +

      geom_histogram(fill = 'white', 

       colour = 'black') +

      facet_grid(smoke ~ .)




除了分面的分组数据对比,还可以通过分组变量映射给fill进行对比。


> birthwt2 <- birthwt

# 将smoke转化成因子

> birthwt2$smoke <- factor(birthwt$smoke)


> ggplot(birthwt2, aes(x = bwt, fill = smoke)) + 

      geom_histogram(position = 'identity', 

       alpha = 0.5)




命令position = 'identity'很重要,没有它图形如下:




这样直方图的条形进行垂直堆积,很难清晰的分清楚每组数据的分布信息。


3

绘制简单密度曲线图


1数据

使用faithful数据集。


2方法

运行geom_density()函数,并映射一个连续变量到x。


3代码

> library(ggplot2)

> ggplot(faithful, aes(x = waiting)) +

      geom_density()


4图形


5讨论

我想宝宝们不喜欢曲线图底部和两侧的线段,

可以使用geom_line(stat = 'density')函数那个“讨厌”的线段就不见了。


> ggplot(faithful, aes(x = waiting)) +

      geom_line(stat = 'density') 

      expand_limits(y = 0)

# 使用expand_limits()函数扩大y轴范围以包含0点


直方图都有了颜色,接下来给点颜色给曲线图看看


> ggplot(faithful, aes(x = waiting)) +

        geom_density(fill = 'blue', 

        colour = NA, alpha = 0.3) + 

        geom_line(stat = 'density', 

        colour = 'blue') +

        xlim(35, 105)



将geom_line(stat = 'density', colour = 'blue') 

命令去就没有顶部线条了。


> ggplot(faithful, aes(x = waiting)) +

        geom_density(fill = 'blue',

        colour = NA, alpha = 0.3) + 

        xlim(35, 105)




现在我们可以将“直方图”和“密度曲线图”相结合:


> ggplot(faithful, aes(x = waiting, 

       y = ..density..)) +

       geom_histogram(fill = 'cornsilk', 

       colour = 'grey60', size = 0.2) +

       geom_density(fill = 'cornsilk3', 

        alpha = 0.3, colour = 'blue') +

        xlim(35, 105)



4

绘制分组数据密度曲线图


1数据

使用MASS包中的birthwt数据集。


2方法

使用geom_density()函数,将分组变量映射给colour和fill等图形属性即可。

分组变量必须是因子型或者字符向量。


3代码

> library(ggplot2)

> library(MASS)

# 为了使用数据

> birthwt3 <- birthwt

# 复制数据副本

> birthwt3$smoke <- factor(birthwt$smoke)

# j将变量smoke转化为因子


> ggplot(birthwt3, aes(x = bwt, 

          colour = smoke)) +

          geom_density(size = 0.8)

# 把变量smoke映射给colour


4图形



5讨论

> ggplot(birthwt3, aes(x = bwt, 

        fill = smoke)) +

        geom_density(alpha = 0.5, colour = NA)

 # 把变量smoke映射给fill




当然,我们可以采用分面对比:

> ggplot(birthwt1, aes(x = bwt, 

       y = ..density..)) +

      geom_histogram(binwidth = 200, 

      fill = 'cornsilk', colour = 'grey60', 

      size = 0.2) +

      geom_density(fill = 'cornsilk2', 

      alpha = 0.4, colour = 'grey60') +

      facet_grid(smoke ~ .) 



也可以将上述直方图和密度曲线图命令分开,这样直方图和密度曲线图就分开了。


5

绘制箱线图


1数据

使用MASS包中的birthwt数据集。


2方法

调用geom_boxplot()函数,分别映射一个连续变量和一个离散变量到y和x即可。


3代码

> library(ggplot2)

> ggplot(birthwt, aes(x = factor(race), 

        y = bwt)) +

        geom_boxplot()


4图形




5讨论

默认的箱线图真的只有数据描述价值,至于颜值后期在讨论。现在看看其他种类。


设置参数width调整箱线图的宽度:


> ggplot(birthwt, aes(x = factor(race),

      y = bwt)) +

      geom_boxplot(width = 0.3)



向箱线图添加均值


> ggplot(birthwt, aes(x = factor(race), 

        y = bwt)) +

       geom_boxplot(width = 0.3) +

       stat_summary(fun.y = 'mean', 

       geom = 'point', shape = 23, 

        size = 3, fill = 'grey')


向箱线图添加槽口


> ggplot(birthwt, aes(x = factor(race), 

        y = bwt)) +

        geom_boxplot(notch = TRUE)




6

绘制二维数据的密度图


1数据

使用faithful数据集。

2方法

调用stat_density()函数。该函数会给出一个基于数据的二维核密度估计。


3代码

> library(ggplot2)

> p <- ggplot(faithful, aes(x = eruptions, 

        y = waiting))

> p + geom_point() + stat_density2d()


4图形



5讨论

也可以使用..level..将密度曲面的高度映射给等高线的颜色。


p + stat_density2d(aes(colour = ..level..))



系统默认使用等高线,也可以使用瓦片图(tile)将密度估计映射给填充颜色或者瓦片的透明度。


> p + stat_density2d(aes(fill = ..density..), 

        geom = 'raster', contour = F)

# 将密度估计映射给填充颜色




> p + geom_point() +

      stat_density2d(aes(alpha = ..density..), 

      geom = 'tile', contour = F)

#  带数据点,将密度估计映射给alpha瓦片图




与一维密度估计一样,可以对估计的带宽进行控制。

传递一个指定x和y带宽的向量到h,这个参数会被直接生成密度估计的函数kde2d()。但是过小的带宽可能导致数据过渡拟合的危险。


> p + stat_density2d(aes(fill = ..density..), 

        geom = 'raster', 

        contour = F, h = c(0.5, 5))




kde2d()是MASS包中的函数,stat_density2d()可以传递到kde2d()。输入?kde2d可以查看函数选项的信息。


1

添加文本注解


1数据

使用R内置数据集faithful,该数据集包含两列关于“老忠实喷泉”的信息。

变量eruptions记录喷泉每次喷发的时长。

变量waiting记录两次喷发之间的时间间隔。


> head(faithful)


  eruptions waiting

     3.600      79

     1.800      54

     3.333      74

     2.283      62

     4.533      85

     2.883      55


  

2方法

运行annotate()函数即可添加文本注释。


3代码

> library(ggplot2)

> p <- ggplot(faithful, aes(x = eruptions, 

        y = waiting)) + 

        geom_point()

> p + annotate('text', x = 3, y = 48, 

        label = 'Group 1') +

        annotate('text', x = 4.5, y = 66, 

        label = 'Group 2')


#  这里的x,y是在了解数据点的刻度范围下才能确定的。


4图形




5讨论

改变注释字体。


代码

> p + annotate('text', x = 3, y = 48, 

        label = 'Group 1', family = 'serif', 

        fontface = 'italic', colour = 'darkred', 

        size = 4) +

     annotate('text', x = 4.5, y = 66, 

        label = 'Group 2', family = 'serif'

        fontface = 'italic', colour = 'darkred', 

        size = 4)


图形




当我们给独立的文本对象时,千万不要使用geom_text()(参考ggplot2包散点图之学习——6绘制标签散点图)。annotate(geom="text")会向文本添加一个单独的文本对象,而geom_text()却会根据数据量创建文本标签量。


> p + annotate('text', x = 3, y = 48, 

        label = 'Group 1', alpha = 0.1) +

      geom_text( x = 4.5, y = 66, 

        label = 'Group 2', alpha = 0.1)




可以看出同样设置文本标签透明度为90%,但是'Group 2'原色有种混杂的感觉,是因为geom_text()却会根据散点量创建文本标签量。


2

在注解中使用数学表达式


1数据



2方法

使用annotate(geom_"text")并设置parse = TRUE。


3代码

> p <- ggplot(data.frame(x = c(-3, 3)), 

        aes(x = x)) + 

     stat_function(fun = dnorm)

> p + annotate('text', x = 2, y = 0.3, 

        parse = T, label = 

        'frac(1, sqrt(2 * pi)) * e ^ {-x^2 / 2}')


#  stat_function()添加函数曲线


4图形



5讨论

在ggplot2中创建数学表达式,和在R基础图形中利用plotmath和expression创建的数学表达式类似的格式,唯一的区别是前者是以字符串的形式储存,而后者是表达式对象。


3

添加直线


1数据

使用heightweight数据集。

> library(gcookbook)


2方法

竖线:geom_vline()

横线:geom_hline()

有角度的直线:geom_abline()


3代码

> library(ggplot2)

> p <- ggplot(heightweight, 

        aes(x = ageYear, y = heightIn, 

        colour = sex)) + 

      geom_point()

> p + geom_hline(yintercept = 60, 

        size = 0.7) + 

      geom_vline( xintercept = 14, 

        size = 0.7)


4图形



5讨论

添加均值水平线。


> library(plyr)   # 为了使用ddply()函数

> hw_means <- ddply(heightweight, 

        'sex', summarise, 

        heightIn = mean(heightIn))

> p + geom_hline(aes

        (yintercept = heightIn, 

        colour = sex), data = hw_means, 

        linetype = 'dashed', size = 1)




4

添加线段和箭头


1数据

使用gcookbook包中的Berkeley数据集中的子集。


2方法

使用annotate("segment")。


3代码

> library(ggplot2)

> library(gcookbook)

> p <- ggplot(subset(climate, 

        Source == 'Berkeley'), 

        aes(x = Year, y = Anomaly10y)) +

        geom_line()

> p + annotate('segment', x = 1950, 

        xend = 1980, y = -0.25, 

        yend = -0.25, size = 0.8)


4图形




5讨论

我们可以添加更视觉冲击的箭头。


> library(grid)

> p + annotate('segment', x = 1850, 

        xend = 1820, y = -0.8, 

        yend = -0.95, colour = 'blue', 

        size = 1.5, arrow = arrow()) +

      annotate('segment', x = 1950, 

        xend = 1980, y = -0.25, yend = -0.25, 

        arrow = arrow(end = 'both',

        angle = 90, length =unit(0.2, 'cm')))




使用grid的包中的arrow()函数向线段两端添加箭头或平头。箭头默认角度(angle)为30度,默认长度(length)为0.2英寸(0.0508cm)。



5

添加矩形阴影


1数据

同上。


2方法

使用annotate("rect")。


3代码

> library(ggplot2)

> library(gcookbook)

> p <- ggplot(subset(climate, 

        Source == 'Berkeley'), 

        aes(x = Year, y = Anomaly10y)) + 

        geom_line()

> p + annotate('rect', xmin = 1950, 

        xmax = 1980, ymin = -1, ymax = 1, 

        alpha = 0.2, fill = 'blue')


4图形




5讨论




6

高亮某一元素


1数据

> pg <- PlantGrowth   

# 复制一份PlantGrowth数据

> pg$hl <- 'no'

# 设定所有值为“no”

> pg$hl[pg$group == 'trt2'] <- 'yes'

#  如果group值为“trt2”,设定为“yes”

2方法

调用scale_fill_manul()函数即可。


3代码

> library(ggplot2)

> ggplot(pg, aes(x = group, 

        y = Weight, fill = hl)) +

        geom_boxplot() +

        scale_fill_manual(

        values = c('grey85', '#FFDDCC'), 

        guide = F )


4图形




5讨论

略。


7

添加误差线


1数据

使用cabbage_exp数据集。

> library(gcookbook)


2方法

调用geom_errorbar()函数并将变量映射到ymin和ymax的值即可。


3代码

> library(ggplot2)

> ce <- subset(cabbage_exp, 

        Cultivar == 'c39')

# 抽取cabbage_exp数据集的Cultivar == 'c39'的数据。


> ggplot(ce , aes(x = Date, y = Weight)) +

      geom_bar(stat = "identity", 

        fill = 'white', colour = 'black') +

      geom_errorbar(aes(ymin = Weight-se, 

        ymax = Weight+se), width = 0.2)


4图形



5讨论

为折线图添加误差线。


> ggplot(ce , aes(x = Date, y = Weight)) +

      geom_line(aes(group = 1)) +

      geom_point(size = 4) +

      geom_errorbar(aes(ymin = Weight-se, 

        ymax = Weight+se), width = 0.2)





为了获得ymax和ymin的值,我们取y值变量Weight加上和减去se。我们使用width = 0.2 指定了误差线的末端宽度。


这次将使用完整的cabbage_exp数据集:


> head(cabbage_exp)

Cultivar Date Weight        sd  n         se

1      c39  d16   3.18 0.9566144 10 0.30250803

2      c39  d20   2.80 0.2788867 10 0.08819171

3      c39  d21   2.74 0.9834181 10 0.31098410

4      c52  d16   2.26 0.4452215 10 0.14079141

5      c52  d20   3.11 0.7908505 10 0.25008887

6      c52  d21   1.47 0.2110819 10 0.06674995


分组的条形图添加误差线


> ggplot(cabbage_exp, aes(x = Date, 

        y = Weight, fill = Cultivar)) +

      geom_bar(stat = "identity", 

        position = 'dodge') +

      geom_errorbar(aes(ymin = Weight-se, 

        ymax = Weight+se), 

        position = 'dodge', width = 0.2)



可以看到误差线和条形柱位置存在偏差,geom_bar()函数的默认列宽为0.9,我们必须让误差线的并列宽度于此相同。


> ggplot(cabbage_exp, aes(x = Date, 

        y = Weight, fill = Cultivar)) +

      geom_bar(stat = "identity", 

        position = 'dodge') +

      geom_errorbar(aes(ymin = Weight-se, 

        ymax = Weight+se), 

        position = position_dodge(0.9), 

        width = 0.2)



给折线图添加误差线


> pd <- position_dodge(0.3)

> ggplot(cabbage_exp, aes(x = Date, 

     y = Weight, colour = Cultivar, 

        group = Cultivar)) +

     geom_errorbar(aes(ymin = Weight-se, 

        ymax = Weight+se), 

        position = pd, width = 0.2, 

     size = 0.25, colour = 'black') +

     geom_line(position = pd) +

     geom_point(position = pd, 

        size = 2.5)



如果geom_line(),geom_point()和geom_errorbar()的函数顺序是这样的,那么图形如下:



误差线在折线上面,整体美观效果大打折扣。


参考书籍:《R数据可视化手册》


计量经济圈社群已经成为最大的计量资料warehouse, 欢迎各位计量爱好者加入我们这个大家庭.


计量经济圈推荐

1.PSM-DID, DID, RDD, Stata程序百科全书式的宝典
2.RDD断点回归, Stata程序百科全书式的宝典
3.Generalized分位数回归, 新的前沿因果推断方法
4.Heckman模型out了,内生转换模型掌控大局
5.PSM倾向匹配Stata操作详细步骤和代码,干货
6.条件Logit绝对不输多项Logit,而混合模型最给力
7.广义PSM,连续政策变量因果识别的不二利器
8.自回归VAR模型操作指南针,为微观面板VAR铺基石
9.有限混合模型FMM,异质性分组分析的新筹码
10.政策评估中"中介效应"因果分析, 有趣的前沿方法
11.多期三重差分法和双重差分法的操作指南
12.多期双重差分法,政策实施时间不同的处理方法
13.随机前沿分析和包络数据分析 SFA,DEA 及操作
14.你的内生性解决方式out, ERM已一统天下而独领风骚
15.多期DID的经典文献big bad banks数据和do文件
16.面板数据里处理多重高维固定效应的神器
17.双栏模型Hurdle远超Tobit, 对于归并数据舍我其谁
18.面板数据计量方法全局脉络和程序使用指南篇

所有计量经济圈方法论丛的do文件都放在社群里,可以直接取出使用运行,也欢迎到研究小组交流访问.感谢咱们计量经济圈社群伙伴们的理解,愿这个社区陪你走过一段难忘的路途。


计量经济圈是中国计量第一大社区,我们致力于推动中国计量理论和实证技能的提升,圈子以海内外高校研究生和教师为主。计量经济圈六多精神:计量资料多,社会科学数据多,科研牛人多,名校人物多,热情互助多,前沿趋势多。如果你热爱计量并希望长见识,那欢迎你加入到咱们这个大家庭(戳这里),要不然你只能去其他那些Open access圈子了。注意:进去之后一定要看小鹅社群“群公告”,不然接收不了群息,也不知道怎么进入咱们独一无二的微信群和QQ群。


进去之后就能够看见这个群公告了


: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存