柱状图和折线图的组合图是excel里很容易实现的一个功能,日常报表里也经常使用这类型的图。最近想用Rmarkdown自动生成日报并直接发邮件,但却被这个简单的图难住了。

先造一些数据,没有实际意义。柱状图要显示绝对值,折线图要显示百分比。formattable包可以把小数显示成百分比而保留其numeric的类型。

library(formattable)

# test data 数据均为捏造

y

waterfall = c(2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6),

humidity=percent(c(0.5012, 0.25, 0.1818, 0.3333, 0.5385, 0.9091, 0.7273)))

在excel中的效果如下图,有点丑,别介意,大致就是这么个意思:

尝试1: ggplot2

R里画图第一个想到的是用ggplot2,觉的就是一个柱状图的layer加上一个折线图就好了。但是想起来容易,操作起来却挺困难。第一个是双坐标轴的问题。这个问题无解,因为据说ggplot2的作者不喜欢双坐标轴,觉得会误导读者。那折线图就不要次坐标了吧,也不是不可以。然后把小数据映射到大数据的量级,如100%对应max(降水量),避免百分比的量级太小而在图片上看不清。然后是添加图例。柱状图和折线图可以单独添加图例,但是两个会添加在同一个位置并且彼此重叠。因为legend的position是通过theme来调节的,不能分别作用于柱状图和折线图。目前我还没找到解决方法,希望高人指点。我能做到的就是下图这样了:

代码

ggplot(y)+

geom_bar(aes(x=y[1:7,1], y=y[1:7,2]), stat="identity", width=.5, fill='#227487')+

ylim(c(0,200))+

geom_text(aes(x=y[1:7,1], y=y[1:7,2], label=y[1:7,2]), vjust=-0.5)+

geom_line(aes(x =y[1:7,1], y=y[1:7,3]*max(y[1:7,2]),linetype = '湿度' , group=1), size=1.2, color='#ca3e1c')+

# scale_colour_manual(values = c("湿度"="red")) +

geom_point(aes(x =y[1:7,1], y=y[1:7,3]*max(y[1:7,2])), size=4, shape=21, fill='white', color='#ca3e1c')+

geom_text(aes(x=y[1:7,1], y=y[1:7,3]*max(y[1:7,2]),

label=paste(y[1:7,3]*100, '%', sep='')), vjust=-1)+

xlab('')+ylab('降雨量')+

theme(axis.text=element_text(size=12), axis.title=element_text(size=12),

legend.title=element_blank(),

panel.background = element_rect(fill = 'white', colour = 'white'),

legend.position="top")+

ggtitle('测试数据')

双坐标轴还可以用R自带的plot来做,也有一个双坐标轴的包,但图都有点丑,所以没有再研究了。有兴趣可以看stackoverflow上的这篇 How can I plot with 2 different y-axes?

尝试2: recharts

recharts是R调用百度echarts的一个包,目前其实有两个包叫recharts,一个是yihui做的,另一个是taiyun的。taiyun的包里把echarts的各个图形分类别做了接口,代码简单,但是可定制的地方较少,比较适合不需要复杂图形的情况。yihui的包基本就是把js语言先用R的格式写,然后再翻译成js语言(我猜的),所以定制能力几乎和原生echats一样。我这里用的是yihui的包,注意安装时不要通过cran而是从github安装,因为从cran安装的recharts版本较低。

devtools::install_github("yihui/recharts")

我用的echarts模版是它的折柱混合图。在默认的基础上改了bar和line的颜色,增加并格式化label,修改次坐标轴的label格式。

library(recharts)

barnline

title = list(text = '测试数据'),

tooltip = list(),

legend = list(data=c('降水量','湿度')),

xAxis= list(

type= 'category',

data= y$date,

splitLine = list(show=FALSE) # 删掉竖线

),

yAxis= list(

list(

type= 'value',

name= '降水量',

min= 0,

max= ceiling(max(y$waterfall/10))*10,

interval= ceiling(max(y$waterfall/10))*10/5,

splitLine=list(

show=FALSE # 删掉横线

)

#axisLabel= list (formatter= '{value} ml')

),

list(

type= 'value',

name= '湿度',

min= 0,

splitLine=list(

show=FALSE

) ,

max= 1,

interval= 0.2 ,

axisLabel= list(formatter= JS("function(value){return value * 100 + '%';}"))

)

),

series = list(

list(

name="降水量",

type='bar',

data=y$waterfall,

itemStyle = list(

normal=list(color = '#227487', label = list(show = TRUE)) # set bar color and label

)

),

list(

name='湿度',

type='line',

yAxisIndex= 1,

data=y$humid

![excel.jpg](http://upload-images.jianshu.io/upload_images/4006139-cde6c9d7d654bb1c.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

ity,

itemStyle = list(

normal=list( label = list(show = TRUE, formatter= JS("function(c){return Math.floor(c.value * 10000)/100 + '%';}"))) # label保留小数点后两位

)

)

)

)

echart(barnline, width = 700, height =400)

效果截图,动态效果可参考echarts示例:

一点体会:

把echarts源代码中所有的冒号:{}改成等号=, 所有的花括号{}改成list()。

不知道yihui接的是echarts2还是echarts3,在echarts3里显示数据label是单独的一条label语句,但R里要放到itemStyle中,否则报错。

总的来说很方便,定制性很高。

echarts双柱_R+Echarts画双坐标轴折柱混合图相关推荐

  1. 迪赛智慧数——柱状图(折柱混合图):2021年毕业季租房价格和房租收入比

    效果图 又是一年毕业季,目前也成为毕业生租房热季,大批毕业学子即将开启全新的生活.不过,"一房难求".选房翻车.房租高昂等问题,让租房成为了很多毕业生迈不过去的一道坎. 在全国各城 ...

  2. vue项目中使用 Echarts的一些总结,包括饼图,折现图,折柱混图,年月日切换

    先奉上官网地址,一切以官网为主 Echrts官网 Echarts的基本使用 安装 cnpm i echarts -S 全局使用 在main.js中引入,然后用变量,将其挂载到vue的原型上 impor ...

  3. Python 金融数据可视化(两列数据的提取//分别画//双坐标轴//双图//两种不同的图)...

    import matplotlib as mpl import numpy as np import matplotlib.pyplot as pltnp.random.seed(2000) y = ...

  4. R语言ggplot画双坐标-柱状图、折线图

    ggplot一般不用来画双坐标,有些图双坐标结合起来看比较好,比方说条形图和柱状图. 1.画双坐标要用到函数scale_y_continuous,这个函数规定次坐标与主坐标的换算关系,用 sec_ax ...

  5. echarts折柱混线图根据后台数据动态刷新显示数据

    我电脑没有可以制作动图的软件,之前用office自带的PowerPoint录制视频但因为其它原因也无法录制了,所以页面效果我暂时放几张相连的图片展示效果哈,见谅: 整体思路: 为了便于理解,我将后台获 ...

  6. Echarts 开发混搭图表实现步骤,并实现多图联动

    文章目录 一.Echarts图表制作准备工作 二.给饼图和柱状图增加配置项 三.分别画饼图和柱状图 四.配置两个图表样式 ------ 显示在一行 五.实现多图联动 六.完整源代码 好文章 记得收藏+ ...

  7. echarts系列-带图教你调整左右位置x轴样式网格虚线刻度居中双轴Y轴滚动上下移动文字旋转改分割线颜色部分字体改色折注混合,X轴的颜色,X轴字体颜色,调整柱子颜色,调整小图标图例的大小和位置,鼠标

    本文已参与「新人创作礼」活动,一起开启掘金创作之路. 宝子们,今天又是开心的一天呢~ 上面先说注意事项 1.如果使用show hidden控制图表显示隐藏,某些切换效果很奇怪,比如饼图,会从左上角开始 ...

  8. eCharts双坐标轴,实现刻度一致

    遇到的问题:eCharts使用双y轴时,经常出现双线的情况  需要实现单线 实现方法:添加yAxis刻度的最小值和最大值及间隔即可 yAxis: [{type: 'value',// 左侧的第一个y轴 ...

  9. 小程序开发华为P20、voiv下Echarts图表不显示数据、坐标轴等问题

    背景:小程序开发 BUG:华为P20.viov手机系统下Echarts图表不显示数据.坐标轴等问题.如下图: 解决方案:WXML中使用的ec-canvas标签加入属性force-use-old-can ...

  10. matplotlib 画双轴子图无法显示 x-轴 坐标轴标签

    主要问题 1.介绍 如题,画双轴子图不能显示 x-轴坐标轴标签,似乎 "双轴"与"子图"存在冲突有关,当前版本是 anaconda 3.7.4.比较奇葩的是 我 ...

最新文章

  1. java平台类成员访问修饰符_JAVA类的修饰符及访问权限
  2. 调研Redis高可用两种方案
  3. Java_memcached 使用说明
  4. rabbitmq实战_RabbitMQ 实战系列之:消息传递
  5. net start zabbix agent 服务没有相应控制功能_一步到位,服务器监控就是这么简单...
  6. Wooden Sticks POJ - 1065(最大上升子序列+动态规划状态转移思维)
  7. 证书的应用之一 —— TCPSSL通信实例及协议分析(上)
  8. noj数据结构稀疏矩阵的加法十字链表_数据结构之:图
  9. 自从知道了这几个 JavaScript 技巧,下班都变早了!
  10. 作为程序员,起码要知道的 Python 修饰器!
  11. 算法 matlab_MATLAB遗传算法及其实现
  12. 【Windows】win10电脑Miracast投屏到电视
  13. 关闭笔记本电脑计算机键盘,笔记本电脑关闭键盘_笔记本电脑怎么关键盘
  14. win10LTSC(企业版)命令激活
  15. C语言编程基础,手机购物程序的设计
  16. linux看视频装哪个软件,Ubuntu安装视频播放软件 SMPlayer 14.9.0.7042
  17. oracle用户 expire,Oracle 账号 EXPIRED(GRACE) 意义-拾亿
  18. 你这一生其实只有9年
  19. 爬虫120例之第17例,用Python面向对象的思路,采集各种精彩句子
  20. 夏雨老师:告诉你常见颜色对人心理上的影响

热门文章

  1. ftp-cmd常用命令
  2. 微信小程序实现下拉刷新和上拉触底,获取新数据
  3. ArcGIS与GIS知识:ARCGIS中坐标转换及地理坐标、投影坐标的定义以及投影分度带的划分
  4. [c++] WINAPI
  5. PHP网站接入QQ互联实现QQ登录获取用户信息功能,超级简单,三个文件就搞定,无需费力地去了解官方提供的一大堆Demo文件
  6. 国内信号处理类EI期刊
  7. 伺服电机和步进电机的区别
  8. php 公众号多图文消息,微信公众号怎么发布号多图文消息?微信公众号发布号多图文消息的方法...
  9. 18. OP-TEE中secur world和non-secure world的切换过程
  10. 小程序中插入腾讯视频