R数据可视化-ggplot2的坐标系

在ggplot2中,为了得到更好的数据可视化效果,我们可能要用到一些坐标转换的操作。

ggplot2包含了6种不同的坐标系:

名字 描述
coord_cartesian 笛卡尔坐标系
coord_equal 同尺度笛卡尔坐标系
coord_flip 翻转的笛卡尔坐标系
coord_trans 变换的笛卡尔坐标系
coord_map 地图射影
coord_polar 极坐标系

笛卡尔坐标系

笛卡尔坐标系参数说明:

1
coord_cartesian(xlim = NULL, ylim = NULL)

xlim、ylim参数用来限定x、y轴的范围。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
library(gridExtra)

# 完整数据集-左
p1 <- ggplot(data = diamonds, mapping = aes(x = carat, y = price))
p1 <- p1 + geom_point()
p1 <- p1 + geom_smooth()

# x的标度范围设置-中
p2 <- p1 + scale_x_continuous(limits = c(0,3))

# x轴坐标系范围设置-右
p3 <- p1 + coord_cartesian(xlim = c(0,3))

grid.arrange(p1,p2,p3,ncol=3)

左图是完整的数据集,中图为x的标度范围设置,右图为x轴坐标系范围设置。标度的范围设置是对数据取子集,然后再重新拟合曲线。坐标系的放缩就是图像的放缩

上面的这个图看的不是很明显,下面看个更明显的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
library(gridExtra)

# 完整数据集-左
p1 <- ggplot(data = diamonds, mapping = aes(x = carat, y = price))
p1 <- p1 + stat_bin2d(bins = 10)

# x的标度范围设置-中
p2 <- p1 + scale_x_continuous(limits = c(0,3))

# x轴坐标系范围设置-右
p3 <- p1 + coord_cartesian(xlim = c(0,3))

grid.arrange(p1,p2,p3,ncol=3)

这里我们可以通过方块的大小很直观的发现,当设定标度范围时,方块的数目还是相同的,只是覆盖了更少数的区域,当设定坐标系范围时,方块数目变少,但它们覆盖的区域没变

坐标轴翻转

1
coord_flip()

把x轴和y轴互换,没有特殊参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
library(gridExtra)

# 正常数据集-左
p1 <- ggplot(data = diamonds, mapping = aes(x = carat, y = price))
p1 <- p1 + geom_point()
p1 <- p1 + geom_smooth()

# 坐标轴属性改变-中
p2 <- ggplot(data = diamonds, mapping = aes(x = price, y = carat))
p2 <- p2 + geom_point()
p2 <- p2 + geom_smooth()

# 坐标轴翻转-右
p3 <- p1 + coord_flip()

grid.arrange(p1,p2,p3,ncol=3)
  • 左图是原散点图相应的平滑曲线
  • 中图互换两个属性变量,平滑曲线拟合的是旋转后的变量
  • 右图coord_flip()拟合原始数据,然后再翻转输出结果,就变成是以y为条件变量刻画x的曲线了

坐标轴变换

1
coord_trans(x = "identity", y = "identity", limx = NULL, limy = NULL)

坐标形式转换包括对数转换、平方根转换等,这里x和y的值可以是log10,log2或squal等,另外两个参数也是限定坐标范围。

这个坐标轴变换函数coord_trans()scale_x_log10()这类函数是有区别的:

  • 坐标轴变换函数是其他处理优先,最后作图时再取对数
  • 标度函数是先将数据取对数,然后再拿进来处理

我们拿拟合曲线举例子:

  • 如果用scale_x_log10就相当于把x的数据取了对数放进来做回归,拟合出一条直线。
  • 如果用coord_trans则是先用原有数据进行回归,得到一条拟合直线之后再变换坐标轴,曲线也会被弯曲
1
2
3
4
5
6
7
8
9
10
11
12
13
14
library(gridExtra)
library(scales)

# 正常数据集-左
p1 <- ggplot(data = diamonds, mapping = aes(x = carat, y = price))
p1 <- p1 + geom_point()

# 标度变换-中
p2 <- p1 + scale_x_log10() + scale_y_log10() + geom_smooth(method = 'lm')

# 坐标轴变换-右
p3 <- p2 + coord_trans(x = exp_trans(10),y=exp_trans(10))

grid.arrange(p1,p2,p3,ncol=3)

坐标系层面的变换发生再统计变换之后,会影响拟合的曲线形状

  • 左图为克拉和价格的散点图
  • 中图为克拉和价格对数变换后的散点图,直线为回归曲线:log(y)=a+blog(x)
  • 右图将前面的图变换回去,标度还原,因此线性趋势变成指数形式,y=k(c^x)

极坐标转换

极坐标转换可以做出蜘蛛图或饼图的效果。

1
coord_polar(theta = "x", start = 0, direction = 1)
  • theta可以选择x或y,表示外延的坐标
  • start是坐标开始的角度,默认起始位置是12点钟

下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
library(gridExtra)

# 柱状图-上图
p1 <- ggplot(data = diamonds, mapping = aes(x = factor(1), fill = cut))
p1 <- p1 + geom_bar()

# 圆环图效果-下图左
p2 <- p1 + coord_polar(theta="x")

# 饼图效果-下图右
p3 <- p1 + coord_polar(theta="y")

grid.arrange(p2,p3,ncol=2)
  • 上图:当使用一个因子变量作为横轴,使用分类变量进行填充时,该柱形图变成了单条堆积柱形图。
  • 当theta指定为x时,柱形图的x轴会被指定为极坐标的x轴(圆周),而柱形图的y轴则会成为极坐标的y轴(半径)。
  • 当theta指定为y时,柱形图的y轴为被指定为极坐标的x轴(圆周),而柱形图的x轴则会成为极坐标的y轴(半径)。

当有多个序列时:

1
2
3
4
5
6
7
8
9
10
11
12
13
library(gridExtra)

# 柱状图-上图
p1 <- ggplot(data = diamonds, mapping = aes(x = cut, fill = cut))
p1 <- p1 + geom_bar()

# 南丁格尔玫瑰图效果-左
p2 <- p1 + coord_polar(theta="x")

# 圆环图、圆条图效果-右
p3 <- p1 + coord_polar(theta="y")

grid.arrange(p2,p3,ncol=2)

当有多个序列时,我们可以通过极坐标转换可以实现圆环图、圆条图效果以及南丁格尔玫瑰图效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
library(gridExtra)

# 堆叠柱状图-上图
p1 <- ggplot(data = diamonds, mapping = aes(x = color, fill = cut))
p1 <- p1 + geom_bar()

# 堆叠玫瑰图效果-左
p2 <- p1 + coord_polar(theta="x")

# 复杂的圆环图效果-右
p3 <- p1 + coord_polar(theta="y")

grid.arrange(p2,p3,ncol=2)

参考


----------- 本文结束啦感谢您阅读 -----------

赞赏一杯咖啡