用ggplot2画了一个我也叫不上名的炫酷图表

今日心血来潮,看到一幅制作精良的图表,就想使用ggplot2代码实现,虽然不知道该怎么称呼这个图表,但是能顺利做出来也是很有成就感的!

加载数据包

library("ggplot2")
library("grid")
library("showtext")
library("Cairo")
font.add("myfont","msyh.ttc")

构造图形数据源

mydata<-data.frame(
id=1:13,
class=rep_len(1:4, length=13),
Label=c("Events","Lead List","Partner","Markeiting & Advertising","Tradeshows","Paid Search","Webinar","Emial Campaign","Sales generated","Website","Other","Facebook/Twitter/\nOther Social","Employee & Customer\nReferrals"),
Value=c(7.6,15.5,17.9,21.8,29.6,29.7,32.7,43.0,57.5,61.4,67.4,68.6,68.7)
)

可视化过程:

第一步:制作基本柱形图:

(这里我用一个序列作为 占位遮挡住了底部的堆积柱形图)

ggplot(mydata)+
geom_col(aes(x=id,y=Value/2+150,fill=factor(class)),colour=NA,width=1)+
geom_col(aes(x=id,y=150-Value/2),fill="white",colour="white",width=1)+
scale_x_continuous(limits=c(0,26),expand=c(0,0))

第二步:使用极坐标转换:

ggplot(mydata)+
geom_col(aes(x=id,y=Value/2+150,fill=factor(class)),colour=NA,width=1)+
geom_col(aes(x=id,y=150-Value/2),fill="white",colour="white",width=1)+
scale_x_continuous(limits=c(0,26),expand=c(0,0))+
coord_polar(theta = "x",start=-14.275, direction = 1)

第三步:对颜色搭配和主题进行修饰:

ggplot(mydata)+
geom_col(aes(x=id,y=Value/2+150,fill=factor(class)),colour=NA,width=1)+
geom_col(aes(x=id,y=150-Value/2),fill="white",colour="white",width=1)+
scale_x_continuous(limits=c(0,26),expand=c(0,0))+
coord_polar(theta = "x",start=-14.275, direction = 1)+
scale_fill_manual(values=c("#31A2CE","#DDB925","#3F9765","#C84F44"),guide=FALSE)+
theme_void()

第四步:修饰剩余文本元素:

p<-ggplot()+
geom_col(data=mydata,aes(x=id,y=Value/2+150,fill=factor(class)),colour=NA,width=1)+
geom_col(data=mydata,aes(x=id,y=150-Value/2),fill="white",colour="white",width=1)+
geom_line(data=NULL,aes(x=rep(c(.5,13.5),2),y=rep(c(126,174),each=2),group=factor(rep(1:2,each=2))),linetype=2,size=.25)+
geom_text(data=mydata,aes(x=id,y=ifelse(id<11,160,125),label=Label),size=3.5,hjust=0.5)+
geom_text(data=mydata,aes(x=id,y=ifelse(id<11,185,150),label=paste0(Value,"%")),hjust=.5,size=4.5)+
scale_x_continuous(limits=c(0,26),expand=c(0,0))+
coord_polar(theta = "x",start=-14.275, direction = 1)+
scale_fill_manual(values=c("#31A2CE","#DDB925","#3F9765","#C84F44"),guide=FALSE)+
theme_void();p

第五步:精修图表

#图表标题、副标题title="Events,Lead Lists and partners-\nmore likely be colosed-lost"content="Marketing events may by fun, but they create\nlousy sales opprunities.When analyzing share\nof closed-won vs.closed-lost opportunities,\nevents,leads lists and partners seem to provide the\nworst performance,while refreals and social\nprovide the best performance."
#图形输出:setwd("E:/数据可视化/R/R语言学习笔记/数据可视化/ggplot2/优秀R语言案例")
CairoPNG(file="polar_bar.png",width=1200,height=900)
showtext.begin()
grid.newpage()
pushViewport(viewport(layout=grid.layout(6,8)))
vplayout<-function(x,y){viewport(layout.pos.row =x,layout.pos.col=y)}
print(p,vp=vplayout(1:6,1:8))
grid.text(label=title,x=.50,y=.6525,gp=gpar(col="black",fontsize=15,fontfamily="myfont",draw=TRUE,fontface="bold",just="left"))
grid.text(label=content,x=.50,y=.56,gp=gpar(col="black",fontsize=12,fontfamily="myfont",draw=TRUE,just="left"))
showtext.end()
dev.off()

备注:(以上图表标签是手动调整过位置的)

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2017-09-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏落影的专栏

程序员进阶之算法练习(十四)

前言 坚持做算法练习对开发的好处是抽象能力变强,拿到一个需求能很快对其进行抽象,然后再用学过的设计模式相关知识进行整理,最后用代码实现。 最大的好处在于:对...

3547
来自专栏吉浦迅科技

DAY15:阅读CUDA C runtime之纹理内存

1433
来自专栏专知

如何在TensorFlow上高效地使用Dataset

【导读】近日,机器学习工程师Francesco Zuppichini发表一篇教程,讲解了在TensorFlow中高效地输入数据集的方法,作者首先抛弃了feed-...

4.3K5
来自专栏MyBlog

软件测试方法课程笔记(2)

为了产生少量的测试用例, 并且可以测试大部分的情况, 我们可以使用等价类划分的方法 比如对于输入值是范围值, 我们可以使用等价类划分成范围内的和不是范围内的两...

1472
来自专栏自然语言处理

文本挖掘系列文章2

字符串、字符数组以及其他文本表示的处理库构成大部分文本处理程序的基础。大部分语言都包括基本的处理库,这也是对文本处理或自然语言处理的前期必要工作。典型代表便是分...

1362
来自专栏QQ音乐技术团队的专栏

​关于 M4A 文件的随机访问

文章介绍了 M4A 文件的大概结构,详细解读了其中的 Sample Table Box,并结合图例,详细讲解了如何使用它来完成 M4A 文件的随机访问。

4490
来自专栏牛客网

百度云部门 C++面试

14)读套接口时候返回0,时候时候产生EAGIN。【EAGIN也不太清楚,知道又这个玩意,不知道具体的,应该直接说不知道】

1612
来自专栏书山有路勤为径

Convolutional Neural Networks: Application

X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()

752
来自专栏互联网大杂烩

String.hashcode 源码分析

接触编程这么久了,一直会遇到某些高频词,例如,哈希。hashtable,hashmap,hashset等等等。都有hash一次。那什么是哈希值呢?百度本科解释是...

934
来自专栏杨熹的专栏

几种简单的文本数据预处理方法

本文将介绍几种简单的文本数据预处理方法,希望与大家共同学习分享。

3314

扫码关注云+社区

领取腾讯云代金券