R语言可视化——极坐标变换与衍生图表类型

今天这篇内容会比较杂乱一点,因为会讲到ggplot函数中的一大类通过极坐标支持才能呈现出来的图表效果。

ggplot作图背后的图表哲学,没有给予饼图(以及衍生出的圆环图、玫瑰图等放射状图表类型)存在的空间(主要是该包的开发者个人的审美观,比较反感次坐标轴以及功能类型雷同的重复性图层函数,所以它宁可开发出分面图层原理也不愿意增加次坐标轴,不愿意为原本柱形图可以表达的图表形式再单独开发一种功能雷同的饼图函数)。

但是巧的是,在常见的三种坐标形式中,极坐标转换可以非常轻松的将常见的柱形图(条形图)、堆积柱形图通过只一句极坐标函数就神奇的转化为饼图、玫瑰图、圆环图等(不知道是有意为之还是偶然的巧合)。

饼图的实现原理:

饼图需要借助柱形图结合极坐标进行转化:

1
2
ggplot(diamonds,aes(x=factor(1),fill=cut))+
geom_bar()

当使用一个因子变量作为横轴,使用分类变量进行填充时,该柱形图变成了单条堆积柱形图。

接下来我们通过以上函数添加极坐标(注意极坐标的设定是如何影响最终的图表形式的)

1
2
3
ggplot(diamonds,aes(x=factor(1),fill=cut))+
geom_bar()+
coord_polar(theta = "y")

1
2
3
ggplot(diamonds,aes(x=factor(1),fill=cut))+
geom_bar()+
coord_polar(theta = "x")

1
2
3
ggplot(diamonds,aes(x=factor(1),fill=cut))+
geom_bar()+
coord_polar()

从做出的图表以及极坐标函数内的参数我们可以看出来,当参数指定为x时,最终柱形图的x轴会被指定为极坐标的x轴(圆周),而柱形图的y轴则会成为极坐标的y轴(半径)。当指定为y轴时,柱形图的y轴为成为极坐标的x轴(圆周),柱形图的x轴会成为极坐标的y轴(半径)。

同时极坐标状态下,饼图的半径是由柱形图(条形图)宽度决定的,以上图表中圆心有个空白,如果我们将柱形图柱形图宽度定义为1,则会成为正圆。

1
2
3
ggplot(diamonds,aes(x=factor(1),fill=cut))+
geom_bar(width=1)+
coord_polar(theta = "y")

极坐标系下图表元素控制:

图中其他的元素控制方式与往常的柱形图做法一样:

去掉极坐标轴的轴刻度标签,去掉两个轴标题、更换配色:

1
2
3
4
5
6
7
8
9
10
11
12
ggplot(diamonds,aes(x=factor(1),fill=cut))+
geom_bar(width=1)+
coord_polar(theta = "y",start=0)+
theme(
panel.grid = element_blank(),
panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank()
)+
scale_fill_brewer(palette="Blues")+
guides(fill=guide_legend(reverse=TRUE,title=NULL))

当有多个序列时:

1
2
ggplot(diamonds,aes(cut))+
geom_bar(width=1)

通过极坐标转换可以实现圆环图、圆条图效果:

1
2
3
4
5
6
7
8
ggplot(diamonds,aes(cut))+
geom_bar(width=1,fill="steelblue",colour="white")+
coord_polar(theta = "y",start=0)+
theme(
panel.grid = element_blank(),
panel.background = element_blank(),
axis.text.x = element_blank(),
axis.title = element_blank())

改变极坐标轴参数设置,可以模拟南丁格尔玫瑰图效果:

1
2
3
4
5
6
7
8
9
10
ggplot(diamonds,aes(cut))+
geom_bar(width=0.95,fill="#3182BD")+
coord_polar(theta = "x",start=0)+
theme(
panel.grid = element_blank(),
panel.background = element_blank(),
axis.text.y = element_blank(),
axis.ticks= element_blank(),
axis.title = element_blank())+
ylim(c(-3000,22500))

极坐标系下多序列图表:

当然如果你使用的原始柱形图数据中添加了分类序列(也就是堆积柱形图),按照上面的方式可以制作更加复杂的圆环图、堆叠玫瑰图

1
2
3
4
5
6
7
8
9
10
ggplot(diamonds,aes(x=color,fill=cut))+
geom_bar(width=0.95,colour="white")+
coord_polar(theta = "y",start=0)+
theme(
panel.grid = element_blank(),
panel.background = element_blank(),
axis.text.x = element_blank(),
axis.title = element_blank())+
scale_fill_brewer(palette="Blues")+
guides(fill=guide_legend(reverse=TRUE,title=NULL))

1
2
3
4
5
6
7
8
9
10
ggplot(diamonds,aes(x=color,fill=cut))+
geom_bar(width=0.95,colour="white")+
coord_polar(theta = "x",start=0)+
theme(
axis.text.y = element_blank(),
axis.title = element_blank())+
scale_fill_brewer(palette="Blues")+
guides(fill=guide_legend(reverse=TRUE,title=NULL))+
ylim(c(-2000,12000))+
theme_bw()

尝试着用分面来解决多序列问题:

1
2
3
4
5
6
7
8
9
10
11
ggplot(diamonds,aes(x=color,fill=cut))+
geom_bar(width=0.95,colour="white")+
coord_polar(theta = "x",start=0)+
theme(
axis.text.y = element_blank(),
axis.title = element_blank())+
scale_fill_brewer(palette="Blues")+
guides(fill=guide_legend(reverse=TRUE,title=NULL))+
ylim(c(-2000,6000))+
theme_bw()+
facet_grid(.~cut)


联系方式:

wechat:ljty1991
Mail:578708965@qq.com
个人公众号:数据小魔方(datamofang)

qq交流群:[魔方学院]298236508

个人简介:

杜雨
财经专业研究僧;
伪数据可视化达人;
文科背景的编程小白;
喜欢研究商务图表与地理信息数据可视化,爱倒腾PowerBI、SAP DashBoard、Tableau、R ggplot2、Think-cell chart等诸如此类的数据可视化软件,创建并运营微信公众号“数据小魔方”。

Mail:578708965@qq.com


备注信息:

知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

坚持原创技术分享,您的支持将鼓励我继续创作!