R语言中ggplot2绘制双坐标轴图

R包ggplot2绘图精美,可以做出很复杂的图形,深受用户喜爱。它的作者hadley并不推荐使用ggplot2绘制双坐标轴图,认为这样会增加读图的难度,但是目前需要双坐标轴图应用的场景还是很多,如下图形直方图和曲线分别有不同的坐标轴,表示不同的意思,图片展示内容比较丰富

今天我们通过我们的汽车销售数据(公众号回复:汽车销售,可以获得数据)来演示一下ggplot2绘制双坐标轴图,主要是通过sec.axis函数进行转换,进行第二个坐标轴的转换。我们先来导入数据

library(foreign)
library(ggplot2)
library(plyr)
bc <- read.spss("E:/r/test/tree_car.sav",
                use.value.labels=F, to.data.frame=T)

我们来看下数据,car就是汽车售价,age是年龄,gender是性别,inccat是收入,这里分成4个等级,ed是教育程度。
我们用这个数据生成两个子数据,展示不同教育程度人群购车的区别,继续使用原来的summarySE函数生成数据,想了解这个函数的看《R语言绘制带误差和可信区间的折线图》这篇文章,主要是利用这个函数生成不同类型的数据分析指标,函数的代码如下:

summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
                      conf.interval=.95, .drop=TRUE) {
  library(plyr)

  # New version of length which can handle NA's: if na.rm==T, don't count them
  length2 <- function (x, na.rm=FALSE) {
    if (na.rm) sum(!is.na(x))
    else       length(x)
  }

  # This does the summary. For each group's data frame, return a vector with
  # N, mean, and sd
  datac <- ddply(data, groupvars, .drop=.drop,
                 .fun = function(xx, col) {
                   c(N    = length2(xx[[col]], na.rm=na.rm),
                     mean = mean   (xx[[col]], na.rm=na.rm),
                     sd   = sd     (xx[[col]], na.rm=na.rm)
                   )
                 },
                 measurevar
  )

  # Rename the "mean" column
  datac <- rename(datac, c("mean" = measurevar))

  datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean

  # Confidence interval multiplier for standard error
  # Calculate t-statistic for confidence interval:
  # e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
  ciMult <- qt(conf.interval/2 + .5, datac$N-1)
  datac$ci <- datac$se * ciMult

  return(datac)
}

这个函数并不是今天的主要内容,主要是看我们生成的数据

carss<- summarySE(bc, measurevar="car", groupvars=c("gender","ed"))
carss1<- summarySE(bc, measurevar="car", groupvars=c("inccat","ed"))

我们来看看生成的两个数据

Carss

carss1

carss1和carss都有ed这个数据,carss1的数据比carss多,carss1有inccat这个指标carss没有
我们先画一个carss数据的教育和汽车售价的直方图

ggplot() +
  geom_col( data = carss,aes(x = ed,y = car),fill="#6794a7")

上图展示了不同教育程度买车的情况,假设我们想把carss1这个数据的inccat和ci这个指标映射进上图中(不管临床意义,只是展示数据映射),我们可以看到ci这个指标很小0-5这样,而汽车这个指标的范围是0-80,不能通过同一坐标轴展示,所以只能通过分轴展示。主要是通过rescale函数先把ci这个指标在在0-80区间进行标准化转换,然后在投射于右坐标轴。
先把inccat转换成因子

carss1$inccat<-as.factor(carss1$inccat)

绘图

ggplot() +
  geom_col( data = carss,aes(x = ed,y = car),fill="#6794a7")+
  geom_line(data = carss1,aes(x = ed,y = rescale(ci,c(0,80)),colour=inccat,group=inccat),size=1.5) +
  geom_point(data = carss1,aes(x = ed,y = rescale(ci,c(0,80))),shape=21,fill="white",size=4)+
  scale_y_continuous(breaks=pretty_breaks(4),
                     sec.axis = sec_axis( ~rescale(.,c(0,5)),name = "ci",labels=sprintf('%.5f',(0:5))))

图形左轴表示直方图中购车情况,右轴表示不同收入人群的ci情况,把图形进一步美化一下

ggplot() +
  geom_col( data = carss,aes(x = ed,y = car),fill="#6794a7")+
  geom_line(data = carss1,aes(x = ed,y = rescale(ci,c(0,80)),colour=inccat,group=inccat),size=1.5) +
  geom_point(data = carss1,aes(x = ed,y = rescale(ci,c(0,80))),shape=21,fill="white",size=4)+
  scale_y_continuous(breaks=pretty_breaks(4),
                     sec.axis = sec_axis( ~rescale(.,c(0,5)),name = "ci",labels=sprintf('%.5f',(0:5))))+
  labs(title="This is a Title!",subtitle="This is a Subtitle",caption="This is a Caption")+
  theme_minimal(base_size=16) %+replace%
  theme(
    plot.caption = element_text(hjust=0),
    plot.margin = unit(c(1,0.5,1,0.5), "lines")
  )

参考文献

ggplot2:数据分析与图形艺术

ggplot2双坐标轴的解决方案 杜雨 https://zhuanlan.zhihu.com/p/31872309

到此这篇关于R语言中ggplot2绘制双坐标轴图的文章就介绍到这了,更多相关R语言 ggplot2双坐标轴图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • R语言ggplot2包之坐标轴详解

    引言 我们还可以对图形中的坐标轴进行处理,包括x.y轴对换.设定坐标轴范围.刻度线修改与去除等等.要想对图形玩得转,坐标轴处理精通不可或缺. 坐标轴对换 我们使用coord_flip()函数来对换坐标轴. library(ggplot2) library(gcookbook) ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() ggplot(PlantGrowth, aes(x=group, y=weight)) + geom

  • R语言作图:坐标轴的设置方式

    要绘制一张赏心悦目的统计图表,坐标轴的设置至关重要.在R语言底层作图中,对坐标轴的调整主要通过调整plot函数.axis函数和title函数的一系列参数完成. plot(x,y, ...) axis(side,at = NULL, labels = TRUE, tick = TRUE, line = NA, pos= NA, outer = FALSE, font = NA, lty = "solid", lwd = 1, lwd.ticks = lwd, col = NULL,col

  • R语言中ggplot2绘制双坐标轴图

    R包ggplot2绘图精美,可以做出很复杂的图形,深受用户喜爱.它的作者hadley并不推荐使用ggplot2绘制双坐标轴图,认为这样会增加读图的难度,但是目前需要双坐标轴图应用的场景还是很多,如下图形直方图和曲线分别有不同的坐标轴,表示不同的意思,图片展示内容比较丰富 今天我们通过我们的汽车销售数据(公众号回复:汽车销售,可以获得数据)来演示一下ggplot2绘制双坐标轴图,主要是通过sec.axis函数进行转换,进行第二个坐标轴的转换.我们先来导入数据 library(foreign) li

  • R语言利用ggplot2绘制QQ图和箱线图详解

    目录 绘制qq图 函数介绍 例子 绘制boxplot 函数介绍 例子 利用分位点绘制箱线图 将QQ图和箱线图进行融合 函数介绍 参数介绍 注意事项 例子 绘制qq图 在ggplot2中绘制qq图需要两步,geom_qq()将绘制样本分位点,geom_qq_line()将绘制标准正态线 函数介绍 geom_qq() geom_qq( mapping = NULL, data = NULL, geom = "point", position = "identity",

  • R语言可视化ggplot2绘制24小时动态血糖图

    目录 数据格式 创建等距时间序列的方法(分钟) 画图代码 数据格式 sample=read.csv("sample.csv",header = T,stringsAsFactors = F)head(sample) 创建等距时间序列的方法(分钟) time=strptime("00:00:00","%H:%M:%S")+300*0:287 #没有填日期的时候,默认日期为今天 画图代码 #time首先要转换成 POSIXct 格式, 下面的brea

  • R语言学习ggplot2绘制统计图形包全面详解

    目录 一.序 二.ggplot2是什么? 三.ggplot2能画出什么样的图? 四.组装机器 五.设计图纸 六.机器的零件 1. 零件--散点图 1) 变换颜色 2) 拟合曲线 3) 变换大小 4) 修改透明度 5) 分层 6) 改中文 2. 零件--直方图与条形图 1) 直方图 2) 润色 3) 条形图 3. 零件--饼图 4. 零件--箱线图 5. 零件--小提琴图 6. 零件打磨 7. 超级变变变 8. 其他常用零件 七.实践出真知 八.学习资源 九.参考资料 一.序 作为一枚统计专业的学

  • R语言中corrplot标题居中及eps格式输出

    目录 相关性图 corrplot ggcorr eps格式输出图像 相关性图 R中相关性图有两种比较简单的画法,一个是使用corrplot包,另一个则是使用ggcorr,利用这两个包,即可绘制出非常美观的相关性图了.这里不对两个包进行细讲,仅仅只是针对在使用过程中遇到的问题进行解决. corrplot 在使用corrplot进行绘图时,如果我们想要添加一个标题,直接使用title =这个参数会生成如下的结果,我们以示例代码为例: M <- cor(mtcars) corrplot(M, titl

  • 详解R语言中的PCA分析与可视化

    1. 常用术语 (1)标准化(Scale) 如果不对数据进行scale处理,本身数值大的基因对主成分的贡献会大.如果关注的是变量的相对大小对样品分类的贡献,则应SCALE,以防数值高的变量导入的大方差引入的偏见.但是定标(scale)可能会有一些负面效果,因为定标后变量之间的权重就是变得相同.如果我们的变量中有噪音的话,我们就在无形中把噪音和信息的权重变得相同,但PCA本身无法区分信号和噪音.在这样的情形下,我们就不必做定标. (2)特征值 (eigen value) 特征值与特征向量均为矩阵分

  • R语言中的vector(向量),array(数组)使用总结

    对于那些有一点编程经验的人来说,vector,matrix,array,list,data.frame就相当于编程语言中的容器,因为只是将R看做数据处理工具所以它们的底层是靠什么实现的,内存怎么处理的具体也不要深究. R语言很奇怪的是它是面向对象的语言,所以经常会调用系统的方法,而且更奇怪的是总是调用"谓语"的方法,用起来像是写句子一样,记起来真是让人费解.比如is.vector(),read.table(),as.vector().. 直接开始吧:(由于习惯,大部分用"=&

  • R语言中R-squared与Adjust R-squared参数的解释

    前言 最近做项目时,使用 R语言对一些数据做回归计算,分析数据时,想查看这堆数据的相关性,得知R-squared可以得到我想要的信息,但是在打印线性关系式时,看到了R-squared,Adjust R-squared 这两个参数,有点疑惑,上网也查看了一部分资料,最后,发现有两道题可以很明白解释这两个参数,如下: 题一 如果在线性回归模型中增加一个特征变量,下列可能发生的是(多选)? A. R-squared 增大,Adjust R-squared 增大 B. R-squared 增大,Adju

  • R语言中cbind、rbind和merge函数的使用与区别

    cbind: 根据列进行合并,即叠加所有列,m列的矩阵与n列的矩阵cbind()最后变成m+n列,合并前提:cbind(a, c)中矩阵a.c的行数必需相符 rbind: 根据行进行合并,就是行的叠加,m行的矩阵与n行的矩阵rbind()最后变成m+n行,合并前提:rbind(a, c)中矩阵a.c的列数必需相符 > a <- matrix(1:12, 3, 4) > print(a) [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,

  • R语言中Fisher判别的使用方法

    最近编写了Fisher判别的相关代码时,需要与已有软件比照结果以确定自己代码的正确性,于是找到了安装方便且免费的R.这里把R中进行Fisher判别的方法记录下来. 1. 判别分析与Fisher判别 不严谨但是通俗的说法,判别分析(Discriminant Analysis)是一种多元(多个变量)统计分析方法,它根据样本的多个已知变量的值对样本进行分类的方法.一般来说,判别分析由两个阶段构成--学习(训练)和判别.在学习阶段,给定一批已经被分类好的样本,根据它们的分类情况和样本的多个变量的值来学习

随机推荐