添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
逼格高的蛋挞  ·  node.js ...·  1 年前    · 
安静的羽毛球  ·  Updated to VS 17.3.4 ...·  2 年前    · 
沉着的水桶  ·  js map 添加元素-掘金·  2 年前    · 
首发于 Data Analysis
R|ggplot2(三)|coord 系列函数坐标轴转换

R|ggplot2(三)|coord 系列函数坐标轴转换

coord_ 系列函数可以改变xy轴的位置,默认使用 coord_cartesian(),我们可以改变成如下几种

coord_cartesian  默认情况,指定参数则控制图形特定区域放大显示
coord_fixed 图形伸缩变换
coord_flip 横纵坐标位置转换
coord_polar 弯曲横纵坐标(画饼图可以用)
coord_map 将地图变成球状展示(这个我们以后讲到地图再专门说)
coord_trans 转化数据

coord系列函数只影响图形展示,不影响内部数据的值。即使用原数据作图,再对图形进行变动

coord_cartesian

coord_cartesian(xlim = NULL, ylim = NULL, expand = TRUE)

如果不加参数,就是默认的图形,和不加这个函数一样

  • xlim 和 ylim 各接一个二元数值向量,控制显示的区域范围,原理不是截取,而是放大该区域,原有图形不变,超出此范围的点也可以照常显示
  • expand 为T则默认指定xlim轴两端还留一些空隙,F则控制范围即为图形的边缘
library(ggplot2)
p0 <- ggplot(mtcars, aes(wt, drat)) + geom_point()
p0 + coord_cartesian() # 没有变化
p0 + coord_cartesian(xlim = c(2, 4))
p0 + coord_cartesian(xlim = c(2, 4), expand = F)

coord_fixed

coord_fixed(ratio = 1, xlim = NULL, ylim = NULL, expand = TRUE)

其他参数和上面相同,ratio表示纵轴1单位显示的长度,是横轴1单位显示的长度的几倍。比如xy轴都是0-5cm的数据,ratio=2则图形高和宽的比是2:1,即纵轴的1cm显示出来的长度是横轴的两倍。所以ratio越小,图形越扁

p0
p0 + coord_fixed(ratio = 1)
p0 + coord_fixed(ratio = 1/2)
p0 + coord_fixed(ratio = 2)

coord_flip

coord_flip(xlim = NULL, ylim = NULL, expand = TRUE)

横纵轴位置互换,没有特殊参数

p0
p0 + coord_flip()

coord_polar

coord_polar(theta = "x", start = 0, direction = 1)

上面我们提到过如何使用这个函数将柱状图转化为饼图,现在我们对这个图形的参数进行简单调整

  • start 接一个弧度制角度,看饼图起始点放在哪个角度上
  • direction默认为1,各个元素顺时针排列下去,如果是-1则逆时针
pp <- ggplot(mpg, aes(1, fill=class))+geom_bar()
pp + coord_polar(theta = "y")
pp + coord_polar(theta = "y", start = pi/3)
pp + coord_polar(theta = "y", direction = -1)

其实我们会发现,做出来的图形虽然样子像饼图,但是标度什么的都不尽如人意,都需要后期使用其他方法调整,可以看出ggplot2包对饼图的支持是不强的,这个Hadley本人对饼图的排斥也有关系,饼图绝大多数都可以使用柱状图代替。

coord_trans

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

将数据转换为想要的形式,再进行作图,最常见的是取对数。它跟scale_x_log10()函数还是有区别的。

  • 后者等价于先将数据取对数,再拿进来处理
  • 前者则是其他处理优先,最后作图时再取对数。
    我们拿拟合曲线举例子
  • 我们如果用scale_x_log10就相当于把x的数据取了对数放进来做回归,拟合出一条直线。
  • 如果使用coord_trans则是先用原有数据进行回归,得到一条拟合直线之后再变换坐标轴
a <- seq(-5,2,len=30) + abs(rnorm(30,0,0.1))
b <- exp(seq(-5,2,len=30))  + abs(rnorm(30,0,0.1)) + 10
df <- data.frame(a,b)
ps <- ggplot(df, aes(a,b)) + geom_point() +
  coord_fixed(ratio=1)+
  geom_smooth(method="lm")
# 使用log之后的y来做
ggplot(df, aes(a,log10(b))) + geom_point() +
  coord_fixed(ratio=1)+
  geom_smooth(method="lm")
ps + scale_y_log10()
# 使用coord_trans
# ps + coord_trans(y = "log10") # 因为拟合出的曲线y出现负值,所以无法对y取对数,此处报错
# 我们可以取其中一部分来做
df1 <- df[df$a>0,]
ggplot(df1, aes(a,b)) + geom_point() +
  coord_fixed(ratio=1)+
  geom_smooth(method="lm") +
  coord_trans(y="log10")

我们发现使用coord_trans时,拟合出来的曲线发生了弯曲。那是因为是先使用原有数据拟合出了一条直线,之后再改变坐标轴作图,所以曲线也被弯曲了。这不同于直接对数据进行变换的情况。

下面我们讨论当我们需要进行其他变换时应该怎么做。

我们需要使用scales包

library(scales)
pt <- ggplot(df, aes(a,b)) + geom_point() +
  coord_fixed(ratio=1)
pt + coord_trans(y="log10")
ggplot(df, aes(a,b)) + geom_point() +
  coord_fixed(ratio=1)+
  coord_trans(x=exp_trans(exp(1)))

下面使用的exp_trans函数相当于把x轴取了e的指数,这是scales包中的函数,查看exp_trans函数源码

function (base = exp(1)) 
    trans_new(paste0("power-", format(base)), 
              function(x) base^x, 
        function(x) log(x, base = base))