R语言数据可视化教程(ggplot2)_描述常见的数据分布及注释操作

# 6.描述数据分布
# 6.1 绘制简单直方图
# 运用geom_histogram()函数并映射一个连续型变量到参数x
library(ggplot2)
ggplot(faithful,aes(x=waiting))+geom_histogram()
# geom_histogram()函数只需要数据框的其中一列或者一个单独的数据向量作为参数
# 将变量值保存为一个基本向量
w <- faithful$waiting
ggplot(NULL,aes(x=w))+geom_histogram()
# 默认情况下,数据将被切分为30组,可以通过组距(binwidth)参数来调整数据的分组数目,或者将数据切分为指定的分组数目
# 直方图默认的填充色是黑色且没有边框线
# 设置组距为5
ggplot(faithful,aes(x=waiting))+geom_histogram(binwidth = 5,fill="white",colour="black")
# 将x的取值切分为15组
binsize <- diff(range(faithful$waiting))/15
ggplot(faithful,aes(x=waiting))+geom_histogram(binwidth = binsize,fill="white",colour="black")
# 有时,直方图的外观会非常依赖于组距和组边界,可通过调整分组远点(boundary)参数来改变
h <- ggplot(faithful,aes(x=waiting)) # 将基本绘图结果存为变量以便于重复使用
h + geom_histogram(binwidth = 8,fill="white",colour="black",boundary=31)
h + geom_histogram(binwidth = 8,fill="white",colour="black",boundary=35)
# 当数据量较小时,对分组边界的影响将会更大
# 当数据集包含离散型数据时,直方图的非对称型不可忽视。数据分组时,各分组区间左闭右开
# 运行代码geom_bar(stat="bin")也能得到相同的结果,不过,geom_histogram()函数的操作过程更易于解释


# 绘制多个数据对应的分布时,频数多边形(frequency polygon)是一个更加的方案


# 6.2 基于分组数据绘制分组直方图
# 运行geom_histogram()函数并使用分面绘图即可
library(MASS)
# 使用smoke作为分面变量
ggplot(birthwt,aes(x=bwt))+geom_histogram(fill="white",colour = "black",bins = 30)+facet_grid(smoke~.)
birthwt
birthwt1 <- birthwt # 复制一个数据副本
# 将smoke转化为因子
birthwt1$smoke <- factor(birthwt1$smoke)
levels(birthwt1$smoke)
library(plyr)
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~.)
# 分面绘图时,各分面对应的y轴标度是相同的。
# 当各组数据包含的样本数目不同时,可能难以比较各组数据的分布形状
ggplot(birthwt,aes(x=bwt))+geom_histogram(fill="white",colour="black",bins = 30)+facet_grid(race~.)
# 设置参数scales="free"可以单独设定各个分面的y轴标度,这种设置只适用于y轴标度,x轴标度仍然固定
ggplot(birthwt,aes(x=bwt))+geom_histogram(fill="white",colour="black",bins = 30)+facet_grid(race~.,scales = "free")
# 分组绘图的另一种做法是把分组变量映射给fill。此处的分组变量必须是因子型或者字符型的向量
# 把smoke转化为因子
birthwt1$smoke <- factor(birthwt1$smoke)
# 把smoke映射给fill,取消条形堆叠,并使图形半透明
ggplot(birthwt1,aes(x=bwt,fill=smoke))+geom_histogram(position = "identity",alpha=0.4,bins = 30)
# 语句position="identity"很重要,没有它,ggplot()函数会将直方图的条形进行垂直堆积。


# 6.3 绘制密度曲线
# 运用geom_density()函数,并映射一个连续型变量到x
ggplot(faithful,aes(x=waiting))+geom_density()
# 如果不想绘制图形两侧和底部的线段,可以使用geom_line(stat="density")函数
# 使用expand_limits()函数扩大y轴范围以包含0点
ggplot(faithful,aes(x=waiting))+geom_line(stat = "density")+expand_limits(y=0)
# geom_density()函数只需要数据框中的一列作为参数
faithful
# 将变量值保存在一个简单向量里
w <- faithful$waiting
ggplot(NULL,aes(x=w))+geom_density()


# 核密度曲线是基于样本数据对总体分布作出的一个估计。曲线的光滑程度取决于核函数的带宽:带宽越大,曲线越光滑
# 带宽可以通过adjust参数进行设置,其默认值为1
ggplot(faithful,aes(x=waiting))+geom_line(stat = "density",adjust=.25,colour="red")+geom_line(stat="density")+geom_line(stat="density",adjust=2,colour="blue")
# 想要展示曲线的更多部分,可以手动设定x轴的范围,同时,设置alpha=.2使填充色的透明度为80%
ggplot(faithful,aes(x=waiting))+geom_density(fill="blue",alpha=.2)+xlim(35,105)
# 这段代码将使用geom_density()函数绘制一个蓝色多边形,并在顶端添加一条实线
ggplot(faithful,aes(x=waiting))+geom_density(fill="blue",colour=NA,alpha=.2)+geom_line(stat="density")+xlim(35,105)


# 将密度曲线叠加到直方图上,可以对观测值的理论分布和实际分布进行比较。
# 由于密度曲线对应的y轴坐标较小(曲线下的面积总是1),如果将其叠加到未做任何变换的直方图上,曲线可能会很难看清楚
# 设置y=..density..可以减小直方图的标度以使其与密度曲线的标度相匹配。
ggplot(faithful,aes(x=waiting,y=..density..))+geom_histogram(bins = 30,fill="cornsilk",colour="grey60",size=.2)+geom_density()+xlim(35,105)


# 6.4 基于分组数据绘制分组密度曲线
# 使用geom_density()函数,将分组变量映射给colour或fill等图形属性即可
library(MASS)
birthwt1 <- birthwt
# 把变量smoke转化为因子
birthwt1$smoke <- factor(birthwt1$smoke)
# 把变量smoke映射给colour
ggplot(birthwt1,aes(x=bwt,colour=smoke))+geom_density()
# 把变量smoke映射给fill,设置alpha使填充色半透明
ggplot(birthwt1,aes(x=bwt,fill=smoke))+geom_density(alpha=.3)
# 绘制上图时,要求所有用的的数据都包含在一个数据框里,且数据框的其中一列是可用于分组的分类变量
# 另一种对分组数据分布进行可视化的方法是使用分面(facet)
ggplot(birthwt1,aes(x=bwt))+geom_density()+facet_grid(smoke~.)
# 修改标签,需要修改因子水平的名称
# 列出现有的因子水平,然后依照相同的顺序向它们赋予新的名字
levels(birthwt1$smoke)
library(plyr)
birthwt1$smoke <- revalue(birthwt1$smoke,c("0"="No Smoke","1"="Smoke"))
ggplot(birthwt1,aes(x=bwt))+geom_density()+facet_grid(smoke~.)
# 设定y=..density..使直方图的y轴标度降到跟密度曲线相同
ggplot(birthwt1,aes(x=bwt,y=..density..))+geom_histogram(binwidth = 200,fill="cornsilk",colour="grey60",size=.2)+geom_density()+facet_grid(smoke~.)


# 6.5 绘制频数多边形
# 使用geom_freqpoly()函数
ggplot(faithful,aes(x=waiting))+geom_freqpoly()
# 频数多边形看起来跟核密度估计曲线相似,但其传递的信息类似于直方图。它跟直方图都描述了数据本身的信息
# 而核密度曲线只是一个估计,且需要人为输入带宽参数
# 通过binwidth参数控制频数多边形的组距
ggplot(faithful,aes(x=waiting))+geom_freqpoly(binwidth=4)
# 通过直接设定每组组距将数据的x轴范围切分为特定数目的组
# 将组数设定为15
binsize <- diff(range(faithful$waiting))/15
ggplot(faithful,aes(x=waiting))+geom_freqpoly(binwidth=binsize)


# 6.6 绘制基本箱线图
# 使用geom_boxplot()函数,分别映射一个连续型变量和一个离散型变量到y和x即可
library(MASS)
# 使用factor()函数将数值型变量转化为离散型
ggplot(birthwt,aes(x=factor(race),y=bwt))+geom_boxplot()
birthwt
# 箱线图由箱和“须”(whisker)两部分组成。箱的范围是从数据的下四分位数到上四分位数,也就是常说的四分位距(IQR)。
# 箱的中间有一条表示中位数,或者说50%分位数的线。须则是从箱子的边缘出发延伸至1.5倍四分位距内的最远的点
# 如果图中有超过须的数据点,则其被视为异常值,并以点来表示


# 设定参数width可以修改箱线图的宽度
ggplot(birthwt,aes(x=factor(race),y=bwt))+geom_boxplot(width=.5)
# 如果图中异常值较多且图形有重叠,可以通过设置outlier.size和outlier.shape参数修改异常点的大小和点形。
# 异常点默认的大小是2,点形是6,即实心圆
ggplot(birthwt,aes(x=factor(race),y=bwt))+geom_boxplot(outlier.size = 1.5,outlier.shape = 21)


# 绘制单组数据的箱线图时,必须给x参数映射一个特定的取值,否则,ggplot()函数不知道箱线图对应的x轴坐标。
ggplot(birthwt,aes(x=1,y=bwt))+geom_boxplot()+scale_x_continuous(breaks = NULL)+theme(axis.title.x = element_blank())


# 6.7 向箱线图添加槽口(notch)
# 使用geom_boxplot()函数并设定参数notch=TRUE
library(MASS)
ggplot(birthwt,aes(x=factor(race),y=bwt))+geom_boxplot(notch = TRUE)
# 箱线图中的槽口用来帮助查看不同分布的中位数是否有差异,如果各箱线图的槽口互不重合,说明各中位数有差异
# notch went outside hinges. Try setting notch=FALSE
# 说明置信域(槽口)超过了某个箱子的边界。


# 6.8 向箱线图添加均值
# 使用stat_summary()函数。箱线图中的均值常以钻石形状表示
library(MASS)
ggplot(birthwt,aes(x=factor(race),y=bwt))+geom_boxplot()+stat_summary(fun.y = "mean",geom = "point",shape=23,size=3,fill="white")
# 箱线图中间的水平线表示的是中位数,而不是均值。


# 6.9 绘制小提琴图
# 使用geom_violin()函数即可
library(gcookbook)
# 简单绘图
p <- ggplot(heightweight,aes(x=sex,y=heightIn))
p+geom_violin()
# 小提琴图是一种用来对多组数据的分布进行比较的方法,也是核密度估计,但绘图时对核密度曲线取了镜像以使形状对称
# 传统画法中,小提琴图中间叠加了一个较窄的箱线图,同时,用一个白圆圈表示中位数,另外设置outlier.colour=NA可以隐去箱线图中的异常点
p+geom_violin()+geom_boxplot(width=.1,fill="black",outlier.colour = NA)+stat_summary(fun.y = median,geom = "point",fill="white",shape=21,size=2.5)
# 小提琴图默认的坐标范围是数据的最小值到最大值,其扁平的尾部在这两个位置处截断。通过设置trim=FALSE可以保留小提琴的尾部
p+geom_violin(trim = FALSE)
# 默认情况下,系统会对小提琴图进行标准化以使得各组数据对应的图的面积一样。如果不想使各组数据对应的图的面积一样,可以设置scale="count"使得图的面积与每组观测值数目成正比
# 校准小提琴图的面积,令其与每组观测值的数目成正比
p+geom_violin(scale = "count")
# adjust参数可以调整小提琴图的平滑程度,参数的默认值是1,更大的值对应于更平滑的曲线
# 更平滑
p+geom_violin(adjust=2)
# 欠平滑
p+geom_violin(adjust=.5)


# 6.10 绘制Wilkinson点图
# 使用geom_dotplot()函数
library(gcookbook)
countries2009 <- subset(countries,Year==2009&healthexp>2000)
p <- ggplot(countries2009,aes(x=infmortality))
p + geom_dotplot()
# 这种图中,点的分组和排列取决于数据,每个点的宽度对应了最大的组距。系统默认的最大组距是数据范围的1/30,可以通过binwidth参数调整
# 默认情况下,geom_dotplot()函数沿着x轴方向对数据进行分组,并在y轴方向上进行堆积。
# 使用scale_y_continuous()函数可以移除y轴标签,使用geom_rug()函数以标示数据点的具体位置
p+geom_dotplot(binwidth = .25)+geom_rug()+scale_y_continuous(breaks = NULL)+theme(axis.title.y = element_blank())
# 默认的dotdensity分组算法,每个数据堆都放置在它表示的数据点的中心位置。要使用向直方图那样的固定间距的分组算法,可以令method="histodot"。
p+ geom_dotplot(method = "histodot",binwidth = .25)+geom_rug()+scale_y_continuous(breaks = NULL)+theme(axis.title.y = element_blank())
# 点图也能进行中心堆叠,或者采用一种奇数与偶数数量保持一致的中心堆叠方式。这可以通过设置stackdir="center"或者stackdir="centerwhole"来完成
p+geom_dotplot(binwidth = .25,stackdir = "center")+scale_y_continuous(breaks = NULL)+theme(axis.title.y = element_blank())
p+geom_dotplot(binwidth = .25,stackdir = "centerwhole")+scale_y_continuous(breaks = NULL)+theme(axis.title.y = element_blank())


# 6.11 基于分组数据绘制分组点图
# 为了比较多组数据,可以通过设定binaxis="y"将数据点沿着y轴进行堆叠,并沿着x轴分组
library(gcookbook)
ggplot(heightweight,aes(x=sex,y=heightIn))+geom_dotplot(binaxis = "y",binwidth = .5,stackdir = "center")
# 将点图叠加在箱线图上
ggplot(heightweight,aes(x=sex,y=heightIn))+geom_boxplot(outlier.colour = NA,width=.4)+geom_dotplot(binaxis = "y",binwidth=.5,stackdir = "center",fill=NA)
# 也可将点图置于箱线图旁边:通过将x变量视作数值型变量并对其加减一个微小的数值移动箱线图和点图的位置,使点图位于箱线图的左边.
# 当x变量被视为数值型变量时,必须同时指定group,否则,数据会被视为单独一组,从而只绘制出一个箱线图和点图。
# 最后,由于x轴被视为数值型,系统会默认展示x轴刻度标签的数值;必须通过scale_x_continuous()函数对其进行调整,以使得x轴的刻度标签显示为与因子水平相对应的文本
ggplot(heightweight,aes(x=sex,y=heightIn))+geom_boxplot(aes(x=as.numeric(sex)+.2,group=sex),width=.25)+geom_dotplot(aes(x=as.numeric(sex)-.2,group=sex),binaxis = "y",binwidth = .5,stackdir = "center")+scale_x_continuous(breaks = 1:nlevels(heightweight$sex),labels = levels(heightweight$sex))


# 6.12 绘制二维数据的密度图
# 使用stat_density2d()函数。该函数会给出一个基于数据的二维核密度估计。
# 基础图
p <- ggplot(faithful,aes(x=eruptions,y=waiting))
p+geom_point()+stat_density2d()
# 也可使用..level..将密度曲面的高度映射给等高线的颜色
# 将height映射到颜色的等高线
p+stat_density2d(aes(colour=..level..))
# 系统默认使用等高线,也可以使用瓦片图(tile)将密度估计映射给填充色或瓦片图的透明色
# 将密度估计映射给填充色
p+stat_density2d(aes(fill=..density..),geom = "raster",contour = FALSE)
# 带数据点,并将密度估计映射给alpha的瓦片图
p+geom_point()+stat_density2d(aes(alpha=..density..),geom = "tile",contour = FALSE)
# geom= "raster"和geom = "tile"的主要区别在于栅格几何对象能够比瓦片更有效地进行渲染
# 对估计的带宽进行控制。传递一个指定x和y带宽的向量到h,这个参数会被传递给直接生成密度估计的函数kde2d()
p+stat_density2d(aes(fill=..density..),geom = "raster",contour = FALSE,h=c(.5,5))
# stat_density2d()函数和stat_bin2d()函数的关系与它们各自的一维情形,即密度曲线和直方图之间的关系类似。

# 密度曲线是在特点假设下对分布的估计,而分组可视化则是直接表示观测值。


# 7 注释
# 7.1 添加文本注释
# 使用annotate()和一个文本类几何对象
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")
# 函数annotate()可以用于添加任意类型的几何对象
# 也可以指定其他文本属性
p+annotate("text",x=3,y=48,label="Group 1",family="serif",fontface="italic",colour="darkred",size=3)+
  annotate("text",x=4.5,y=66,label="Group 2",family="serif",fontface="italic",colour="darkred",size=3)


# 当希望添加独立的文本对象时,千万不要使用geom_text()。
# annotate(geom="text)会向图形添加一个单独的文本对象,而geom_text()却会根据数据创建许多的文本对象
# 如果使用geom_text(),文本会在相同的位置被严重地遮盖,每个数据点各重绘了一次
p+annotate("text",x=3,y=48,label="Group 1",alpha=.1)+ # 正常
  geom_text(x=4.5,y=66,label="Group 2",alpha=.1) # 遮盖绘制
# 在输出为点阵格式时,遮盖绘制问题可能会导致边缘走样
# 如果坐标轴是连续型的,可以使用特殊值Inf和-Inf在绘图区域的边缘放置文本注解。
# 同时也需要使用hjust和vjust来调整文本相对于边角的位置
p+annotate("text",x=-Inf,y=Inf,label="Upper left",hjust=-.2,vjust=2)+annotate("text",x=mean(range(faithful$eruptions)),y=-Inf,vjust=-0.4,label="Bottom middle")
# 7.2 在注解中使用数学表达式
# 使用annotate(geom="text")并设置parse=TRUE
# 一条正态曲线
p <- ggplot(data.frame(x=c(-3,3)),aes(x=x))+stat_function(fun = dnorm)
p+annotate("text",x=2,y=0.3,parse=TRUE,label="frac(1,sqrt(2*pi))*e^{-x^2/2}")
# 在ggplot2中使用parse=TRUE和文本类几何对象创建的数学表达式,和那些在R基础图形中利用plotmath和expression创建的数学表达式有着类似的格式,
# 唯一的区别是,前者以字符串的形式存储,后者是表达式对象


# 要将常规文本融入表达式中,只需在双引号内使用单引号(或者反过来)标出纯文本的部分即可。
# 通过内部引号闭合的每一块文本都将被作为数学表达式中的一个变量对待。
# 在R的数学表达式语法中,不能简单地把一个变量直接放在另一个变量旁边却不在中间加上任何记号。
# 要显示两个相邻的变量,需要在它们之间放置一个*操作符,在显示图形时,它会被当做一个不可见的乘号对待
# 要显示一个可见的乘号,需要使用%*%
p+annotate("text",x=0,y=0.05,parse=TRUE,size=4,label="'Function:'*y==frac(1,sqrt(2*pi))*e^{-x^2/2}")


# 7.3 添加直线
# 对于横线或竖线,使用geom_hline()和geom_vline()即可。对于有角度的直线,则使用geom_abline()
library(gcookbook)
p <- ggplot(heightweight,aes(x=ageYear,y=heightIn,colour=sex))+geom_point()
# 添加横线和竖线
p+geom_hline(yintercept = 60)+geom_vline(xintercept = 14)
# 添加有角度的直线
p+geom_abline(intercept = 37.4,slope = 1.75)


library(plyr)
hw_means <- ddply(heightweight,"sex",summarise, heightIn=mean(heightIn))
hw_means
p +geom_hline(aes(yintercept=heightIn,colour=sex),data=hw_means,linetype="dashed",size=1)
# 如果某个坐标轴是离散型而不是连续型,不能以字符串的形式直接指定截距——必须仍以数字的形式指定它们
pg <- ggplot(PlantGrowth,aes(x=group,y=weight))+geom_point()
pg+geom_vline(xintercept = 2)
pg+geom_vline(xintercept = which(levels(PlantGrowth$group)=="ctrl"))


# 7.4 添加线段和箭头
# 使用annotate("segment")。
library(gcookbook)
p <- ggplot(subset(climate,Source=="Berkeley"),aes(x=Year,y=Anomaly10y))+geom_line()
p + annotate("segment",x=1950,xend=1980,y=-.25,yend = -.25)
# 可以使用grid包中的arrow()函数向线段两端添加箭头或平头
library(grid)
p+annotate("segment",x=1850,xend = 1820,y=-.8,yend=-.95,colour="blue",size=2,arrow=arrow())+
  annotate("segment",x=1950,xend=1980,y=-.25,yend=-.25,arrow=arrow(ends="both",angle = 90,length = unit(.2,"cm")))
# 箭头线的默认角度(angle)为30度,默认长度(length)为0.2英寸(0.508厘米)
# 如果一个或多个坐标轴是离散型的,则x和y的位置即由拥有坐标值1,2,3等的类型项表示。


# 7.5 添加矩形阴影
# 使用annotate("rect")
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=.1,fill="blue")
# 只要传递了合适的参数,任意几何对象都可以配合annotate()使用
# 本例中geom_rect()所需的参数是x和y的最大值与最小值


# 7.6 高亮某一元素
# 要高亮一个或多个元素,需要在数据中创建一个新列并将其映射为颜色。
pg <- PlantGrowth # 复制一份PlantGrowth数据
pg$hl <- "no" #设定所有值为“no"
pg$hl[pg$group=="trt2"] <- "yes" #如果group值为“trt2",设定为”yes"
# 手工指定颜色绘图
ggplot(pg,aes(x=group,y=weight,fill=hl))+geom_boxplot()+scale_fill_manual(values = c("grey85","#FFDDCC"),guide=FALSE)
# 如果有少量的元素要高亮,可以使用原始变量并为每个水平指定颜色,而不必创建一个新列
ggplot(PlantGrowth,aes(x=group,y=weight,fill=group))+geom_boxplot()+scale_fill_manual(values = c("grey85","grey85","#FFDDCC"),guide=FALSE)


# 7.7添加误差线
# 使用geom_errorbar并将变量映射到ymin和ymax的值即可
library(gcookbook) # 为了使用数据集
# 抽取cabbage_exp数据的一个子集
ce <- subset(cabbage_exp,Cultivar == "c39")
# 为条形图添加误差线
ggplot(ce,aes(x=Date,y=Weight))+geom_bar(fill="white",colour="black")+geom_errorbar(aes(ymin=Weight-se,ymax=Weight+se),width=.2)
######## 报错
# 为折线图添加误差线
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=.2)


ce
cabbage_exp
# geom_bar()的默认并列宽度为0.9,必须让误差线的并列宽度与此相同。
# 如果不指定并列宽度,则默认按误差线的宽度并列,而此宽度通常会小于条形的宽度
# 反例:未指定并列宽度
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(position = "dodge")+geom_errorbar(aes(ymin=Weight-se,ymax=Weight+se),position = "dodge",width=.2)
### 报错
# 正例:设定并列宽度与条形的相同(0.9)
ggplot(cabbage_exp,aes(x=Date,y=Weight,fill=Cultivar))+geom_bar(position = "dodge")+geom_errorbar(aes(ymin=Weight-se,ymax=Weight+se),position = position_dodge(0.9),width=.2)
### 报错


# 对于折线图来说,如果误差线的颜色与线和点的颜色不同,则应先绘制误差线,这样它们就会位于点和线的下层,否则,误差线将被绘制在点和线的上层
# 另外应当同时并列所以的几何元素,这样它们就会同误差线对齐
pd <- position_dodge(.3) # 保存并列参数,因为我们要重复使用它
ggplot(cabbage_exp,aes(x=Date,y=Weight,colour=Cultivar,group=Cultivar))+geom_errorbar(aes(ymin=Weight-se,ymax=Weight+se),width=.2,size=0.25,colour="black",position=pd)+
  geom_line(position = pd)+
  geom_point(position = pd,size=2.5)
# 使用size=0.25绘制更细的误差线线条,使用size=2.5绘制更大的点


# 7.8向独立分面添加注解
# 使用分面变量创建一个新的数据框,并设定每个分面要绘制的值。然后配合新数据框使用geom_text()
# 基本图形
p <- ggplot(mpg,aes(x=displ,y=hwy))+geom_point()+facet_grid(.~drv)
# 存有每个分面所需标签的数据框
f_labels <- data.frame(drv = c("4","f","r"),label=c("4wd","Front","Rear"))
p+geom_text(x=6,y=40,aes(label=label),data=f_labels)
# 如果使用annotate(),标签将在所以分面上出现
p+annotate("text",x=6,y=42,label="label text")


# 此函数返回一个数据框,其中的字符串
# 表示回归公式和r^2值
# 这些字符串被认为是R中的数学表达式
lm_labels <- function(dat){
  mod <- lm(hwy~displ,data=dat)
  formula <- sprintf("italic(y)==%.2f %+.2f * italic(x)",round(coef(mod)[1],2),round(coef(mod)[2],2))
  r <- cor(dat$displ,dat$hwy)
  r2 <- sprintf("italic(R^2) == %.2f",r^2)
  data.frame(formula=formula,r2=r2,stringsAsFactors = FALSE)
}


library(plyr)
labels <- ddply(mpg,"drv",lm_labels)
labels
# 绘制公式和R^2值
p +geom_smooth(method = lm,se=FALSE)+geom_text(x=3,y=40,aes(label=formula),data = labels,parse = TRUE,hjust=0)+
  geom_text(x=3,y=36,aes(label=r2),data = labels,parse = TRUE,hjust=0)


# 计算每组的r^2值
labels <- ddply(mpg,"drv",summarise,r2 =cor(displ,hwy)^2)
labels$r2 <- sprintf("italic(R^2)==%.2f",labels$r2)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镰刀韭菜

看在我不断努力的份上,支持我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值