R语言:ggplot2精细化绘图—以实用商业化图表绘图为例(二)
随你所欲地汇总(group_by & summarize) 甚至再拆分 (spread),譬如示例里面就是把成交记录按照成交价格和BuySell拆分
data #刚刚演示的那些数据,在预测者网可以下载
data %>% group_by(Price,BuySell) %>% summarize(Money=sum(Money,na.rm=TRUE)) %>% spread(BuySell,Money)
Alt text
要想做好ggplot2的图,对数据快速进行塑形的方法是我们必须要掌握的。上面的s wirl课程非常有用,而且值得是最新的一个技术方法,值得大家学习。
3、常用的商业用图
接下来分享一下我在这次作图过程中,最常用的几个图形的代码。首先声明,这些图形的进一步做法以及变形,基本都可以在这两本参考书籍里(R可视化技术 | ggplot2:数据分析与图表技术 )找到。我这里更多的摘取一些我比较常用的图表进行讲解
1、简单柱形图+文本(单一变量)
2、分面柱形图(facet_wrap/facet_grid)
3、簇型柱形图(position=”dodge”)
4、堆积柱形图(需要先添加百分比,再对百分比的变量做柱形图)
5、饼图、极坐标图
6、多重线性图
在作图之前,首先讲一下ggplot2的局限。
ggplot2最大的局限是,它基本不支持双坐标图和饼图。即使能做这些图形,也要很多设置,做起来非常繁琐。
按我个人理解,这个局限的根源与ggplot2开发者Hadley本身的审美习惯以及分析习惯脱不了关系。具体请看他在stackoverflow的这一段问答:
It’s not possible in ggplot2 because I believe plots with separate y scales (not y-scales that are transformations of each other) are fundamentally flawed.
大神有技术就能任性。即使一堆人在他那回复下面各种求双坐标。。不知道Hadley现在有没有改变主意,把双坐标列为ggplot2的下一个更新点。但是如果你想画双坐标图或者饼图,至少经个人的实践,这些都是比较困难的,设置繁琐而且不美观。要么选择用excel完成,要么听大神的话,用分面图(facet)或者柱形图代替,会更加省事一些。
所以,在了解以下常用图形前,我们需要记住,ggplot2不是万能的,它虽然能做出非常美观的图表,但是总有一些图不能做,因此多个工具结合使用是非常必要的。
在知道以上前提下,我们以ggplot2自带的diamonds数据集为基础,结合dplyr/tidyr的应用,介绍一下常用图形的画法。
然后来讲一下除了双坐标图和饼图以外,ggplot2可以支持的常用图形的画法。数据的话,我们使用ggplot2自带的数据包diamonds
首先定义一下
mytitle="演示:以diamond为例"
1)简单柱形图
代码组成如下,这里使用格式刷mybar和mytheme,然后用geom_text添加柱形图标签(vjust=1表示在柱形图里面显示)
data1<-diamonds %>% group_by(cut) %>% summarize(avg_price=mean(price))
柱形图<-ggplot(data1,aes(x=cut,y=avg_price,fill=as.factor(cut)))+
mytitle+mybar+mytheme+
geom_text(aes(label=round(avg_price)),vjust=1,colour="white")
2)带分类的柱形图
举个例子来说,在有时候,我们想要快速绘图。使用facet_wrap或者facet_grid可以快速绘制相应图形。这也是ggplot2不太支持双坐标的原因:可以快速绘图,就不需要做那么多无用功了。
代码如下:
复制代码
#dplyr处理数据
data2<-diamonds %>% group_by(cut,color) %>% summarize(avg_price=mean(price))
#画图,套用设定好的绘图元素
ggplot(data2,aes(x=color,y=avg_price))+facet_wrap(~cut,ncol = 2)+
mytitle+mybar+mytheme
#在facet_wrap里面,如果加上scales="free"的话,坐标就不一样了。
复制代码
3)簇型图
制图要点是,对数据作图后,添加geom_bar时,position=”dodge”(分开的)如果去掉这部分,默认是生成堆积图.
代码如下:
复制代码
data3<-diamonds %>% filter(cut %in% c("Fair","Very Good","Ideal")) %>%
group_by(cut,color) %>% summarize(avg_price=mean(price))
#簇状图
簇状柱形图<-ggplot(data3,aes(x=color,y=avg_price,fill=cut))+
geom_bar(stat="identity",position="dodge")+
mytheme+mytitle+mycolour_3
簇状柱形图
复制代码
这里如果想要定义颜色的相应顺序的话,可以使用factor
譬如以下,只是用这行代码对颜色重新定义一下,用levels改变factor顺序,再画图的时候,颜色以及柱子顺序就会跟着改变了。非常方便。
data3$cut<-factor(data3$cut,levels=c("Very Good","Ideal","Fair"))
4)百分比堆积图
制图前要事先添加一个百分比的数据之后才好作图,这里我们用mutate(percent=n/sum(n))添加该百分比数据。同时去掉position=”dodge”
复制代码
data4<-diamonds %>% filter(cut %in% c("Fair","Very Good","Ideal")) %>%
count(color,cut) %>%
mutate(percent=n/sum(n))
堆积图<-ggplot(data4,aes(x=color,y=percent,fill=cut))+mytitle+
geom_bar(stat="identity")+mytheme+mytitle+mycolour_3
堆积图
复制代码
当然,也可以做面积图。不过如果数据有缺失,面积图出错几率蛮大的
5)饼图以及极坐标图
参考一下这篇文章《【R】初吻R–ggplot绘制Pie Chart饼图》以及这篇文章使用ggplot2画图
在ggplot2里并没有直接画饼图的方法,基本上都是先画出柱形图,再用coord_polar转化为饼图
有两种作图方法:
1)不指定x轴,直接用geom_bar生成y轴,然后fill=分类颜色,coord_polar直接投影y
该方法的好处代码是比较简单(coord_polar(“y”)
加标签方法请见: http://stackoverflow.com/questions/8952077/pie-plot-getting-its-text-on-top-of-each-other#
data5<-diamonds %>% count(cut) %>%
mutate(percent=n/sum(n))
ggplot(data5,aes(x=factor(1),y=percent,fill=cut))+geom_bar(stat="identity",width=3)+mycolour_7+
coord_polar("y")+pie_theme+mytitle
2)指定x轴,x轴同时也是颜色(fill),先画柱形图,再转化为圆形。坏处是公式相对比较繁琐一些。
ggplot(data5,aes(x=cut,y=percent,fill=cut))+
geom_bar(stat="identity",width=3)+
mycolour_7+coord_polar("x")+pie_theme+mytitle
但是我尝试了多次,在饼图里加标签方法非常难以理解。。如果要饼图加标签的话,或许还不如柱形图
附上分面柱形图画法:
data5_1<-data5 %>% filter(color %in% c("D","E","F","G"))
ggplot(data5_1,aes(x=factor(1),y=percent,fill=cut))+geom_bar(stat="identity",width=3)+mycolour_7+
coord_polar("y")+pie_theme+facet_wrap(~color,ncol = 4)+
theme(legend.position="bottom")+mytitle
6、折线图
除了以上柱形图以外,折线图我们做的也比较多。
简单的折线图直接做就好了
然后像下图这样的
要点是,先做成如A-B-变量这样的二联表,然后,x轴为A,group为b,colour为b
下面代码展示了这个处理
如果去掉group的话,折线图会不知道怎么去处理数字。
data6<-diamonds %>% count(color,cut) %>% filter(color %in% c("D","E","F"))%>%
mutate(percent=n/sum(n))
ggplot(data6,aes(x=cut,y=n,group=color,colour=color))+geom_line(size=1.5)+mypoint+
mycolour_line_7+mytheme+mytitle
还有一些其他有用的图形
总之,ggplot2的语法还是比较独特的,而且其实处处有坑,处处有惊喜。如果作为商业绘图的话,需要一点一点地去探索去改变,保证风格和细节完美无缺。
不过ggplot2绘图有个好处是,一旦整理出常用的绘图代码,以后就可以无限次套用,尤其是那些格式刷,事先设定好的主题等。即ggplot2绘图,是完全可以做到越绘越快,再开发成本低廉的。
另外补充说明的是,ggplot2绘图,个人更看好其多种映射,以及在探索性数据分析里快捷绘图的能力,还有跟地图啊等结合的能力。还有动态交互等等。
譬如现在比较流行的R/Python与动态网页(大部分是D3)的结合 示例1,示例2
但愿各位不要将绘图局限于上述所选的一些最常用的图形与格式化调整里。请容我吐槽一句,这样子调风格学习真的很苦(づ ̄ ~~ ̄|||)づ
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在当今这个数据驱动的时代,几乎每一个业务决策都离不开对数据的深入分析。而其中,指标波动归因分析更是至关重要的一环。无论是 ...
2025-02-18当数据开始说谎:那些年我们交过的学费 你有没有经历过这样的场景?熬了三个通宵做的数据分析报告,在会议上被老板一句"这数据靠 ...
2025-02-17数据分析作为一门跨学科领域,融合了统计学、编程、业务理解和可视化技术。无论是初学者还是有一定经验的从业者,系统化的学习路 ...
2025-02-17挖掘用户价值本质是让企业从‘赚今天的钱’升级为‘赚未来的钱’,同时让用户从‘被推销’变为‘被满足’。询问deepseek关于挖 ...
2025-02-17近来deepseek爆火,看看deepseek能否帮我们快速实现数据看板实时更新。 可以看出这对不知道怎么动手的小白来说是相当友好的, ...
2025-02-14一秒精通 Deepseek,不用找教程,不用买资料,更不用报一堆垃圾课程,所有这么去做的,都是舍近求远,因为你忽略了 deepseek 的 ...
2025-02-12自学 Python 的关键在于高效规划 + 实践驱动。以下是一份适合零基础快速入门的自学路径,结合资源推荐和实用技巧: 一、快速入 ...
2025-02-12“我们的利润率上升了,但销售额却没变,这是为什么?” “某个业务的市场份额在下滑,到底是什么原因?” “公司整体业绩 ...
2025-02-08活动介绍 为了助力大家在数据分析领域不断精进技能,我们特别举办本期打卡活动。在这里,你可以充分利用碎片化时间在线学习,让 ...
2025-02-071、闺女,醒醒,媒人把相亲的带来了。 我。。。。。。。 2、前年春节相亲相了40个, 去年春节相亲50个, 祖宗,今年你想相多少个 ...
2025-02-06在数据科学的广阔领域中,统计分析与数据挖掘占据了重要位置。尽管它们常常被视为有关联的领域,但两者在理论基础、目标、方法及 ...
2025-02-05在数据分析的世界里,“对比”是一种简单且有效的方法。这就像两个女孩子穿同一款式的衣服,效果不一样。 很多人都听过“货比三 ...
2025-02-05当我们只有非常少量的已标记数据,同时有大量未标记数据点时,可以使用半监督学习算法来处理。在sklearn中,基于图算法的半监督 ...
2025-02-05考虑一种棘手的情况:训练数据中大部分样本没有标签。此时,我们可以考虑使用半监督学习方法来处理。半监督学习能够利用这些额 ...
2025-02-04一、数学函数 1、取整 =INT(数字) 2、求余数 =MOD(除数,被除数) 3、四舍五入 =ROUND(数字,保留小数位数) 4、取绝对值 =AB ...
2025-02-03作者:CDA持证人 余治国 一般各平台出薪资报告,都会哀嚎遍野。举个例子,去年某招聘平台发布《中国女性职场现状调查报告》, ...
2025-02-02真正的数据分析大神是什么样的呢?有人认为他们能轻松驾驭各种分析工具,能够从海量数据中找到潜在关联,或者一眼识别报告中的数 ...
2025-02-01现今社会,“转行”似乎成无数职场人无法回避的话题。但行业就像座围城:外行人看光鲜,内行人看心酸。数据分析这个行业,近几年 ...
2025-01-31本人基本情况: 学校及专业:厦门大学经济学院应用统计 实习经历:快手数据分析、字节数据分析、百度数据分析 Offer情况:北京 ...
2025-01-3001专家简介 徐杨老师,CDA数据科学研究院教研副总监,主要负责CDA认证项目以及机器学习/人工智能类课程的研发与授课,负责过中 ...
2025-01-29