R+Echarts画双坐标轴折柱混合图

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

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

library(formattable)
# test data 数据均为捏造
y<-data.frame(date=c('1月','2月','3月','4月','5月','6月','7月'),
              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<-list(
  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中,否则报错。
  • 总的来说很方便,定制性很高。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 简介 文章较长,点击直达我的博客,浏览效果更好。本文内容基本是来源于STHDA,这是一份十分详细的ggplot2使...
    taoyan阅读 50,375评论 7 158
  • 这篇文章主要讲述Echarts设置字体和线条的颜色相关操作笔记,希望文章对你有所帮助,主要是自己的在线笔记吧。我在...
    蓝色梦想家阅读 9,734评论 1 1
  • 一大早醒来,冲一杯淡淡的苦咖,坐在飘窗旁的椅子上,靠着窗边,打开简书看着大家的文章,就像是每日必须完成的事情一样。...
    Tom_说阅读 417评论 9 2
  • 临摹靳东,第四遍了,依然差距很大。
    知更鸟I阅读 244评论 1 1
  • 今天傍晚出门吃饭,我穿了一条橙红色的短裙刚好配自己非常喜欢的一件黑色羊绒长大衣。 因为好久没有穿过膝长靴了,靴子需...
    楚浛阅读 945评论 8 19