ggplot2-定位4

非线性坐标系

与线性坐标系不同,非线性坐标系可以改变几何对象的形状。比如说,在极坐标系中,一个矩形变成一个弧形;在地图投影中,两点之间最短距离不一定是一条直线

以下代码展示了一条直线和一个矩形在一些不同坐标系下的呈现

rect <- data.frame(x = 50, y =50)
line <- data.frame(x = c(1, 200), y = c(100, 1))
base <- ggplot(mapping = aes(x, y)) +
	geom_tile(data = rect, aes(width = 50, height = 50)) +
	geom_line(data = line) + xlab(NULL) + ylab(NULL)
base
base + coord_polar("x")
base + coord_polar("y")
base + coord_flip()
base + coord_trans(y = "log10")
base + coord_fixed()

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

坐标系变换分为两步。首先,把几何对象的参数改为只基于位置的表示方式,而不是基于位置和维度。比如说,条形图可表示为x位置(一个位置)以及高度和宽度(两个维度)。在非直角坐标系中解读高度和宽度是困难的,因为一个矩形也许不再有固定的高度和宽度,所以把它转换成一个完全基于位置的表示形式:一个由四个角来定义的多边形。这种方式有效地把所有几何对象变成由点、线、多边形组成的集合

一旦所有的几何对象都拥有了基于位置的表示,下一步是转换每一个位置到新的坐标系中。点的变换比较容易,因为无论在哪个坐标系,点依然是点。线和多边形的变换比较困难,因为在新的坐标系中一条直的线也许不再是直的了。为了简化问题,假设所有坐标系变换都是平滑的,这里“平滑”的意思是一条非常短的直线在新的坐标系中依然是一条非常短的直线。在这个假设之下,可以把线和多边形拆分为很多非常短的线段,然后对这些线段进行变换。这个过程被称为==“分割再组合(munching)”==

  1. 首先,有一条直线,它由两个端点来定义
df <- data.frame(r = c(0, 1), theta = c(0, 3 / 2 * pi))
ggplot(df, aes(r, theta)) + geom_line() +
	geom_point(size = 2, color = "red")

在这里插入图片描述

  1. 把它分割成很多线段,每条线段有对应的端点
interp <- function(rng, n){seq(rng[1], rng[2], length = n)}
munched <- data.frame(r = interp(df$r, 15), theta = interp(df$theta, 15))
ggplot(munched, aes(r, theta)) + geom_line() +
	geom_point(size = 2, color = "red")

在这里插入图片描述

  1. 把每一部分的位置都进行变换
transformed <- transform(munched, x = r * sin(theta), y = r * cos(theta))
ggplot(transformed, aes(x, y)) + geom_path() +
	geom_point(size = 2, color = "red") + coord_fixed()

在这里插入图片描述

ggplot2内部使用远超这里数目的线段,使得效果看上去更平滑

coord_trans()变换

和范围限制类似,可以在两个地方变换数据:在标度层次以及在坐标系层次。函数coord_trans()有参数x和y,它们应该是表示变换函数或变换对象的字符串名称(参考连续位置标度)。标度层次的变换发生在计算统计变换之前,而且不改变几何对象的形状。坐标系层次的变换发生在计算统计变换之后,而且确实会改变几何对象的形状。同时使用这两者使得可以在变换后的标度下对数据建模,然后把模型反变换回去来进行解读:这是分析的常用模式

# 默认的线性模式的拟合效果比较差
base <- ggplot(diamonds, aes(carat, price)) + stat_bin2d() +
	geom_smooth(method = "lm") + xlab(NULL) + ylab(NULL) +
	theme(legend.position = "none")
base 

# 对数变换之后的拟合效果比较好,但是解读更加困难
base + scale_x_log10() + scale_y_log10()

# 对数变换下进行拟合,然后反变换回原来的标度
# 强调了大克拉数的昂贵钻石比较稀少
pow10 <- scales::exp_trans(10)
base + scale_x_log10() + scale_y_log10() +
	coord_trans(x = pow10, y = pow10)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

coord_polar()坐标系

利用极坐标系可生成饼图、玫瑰图(源自条状几何对象)和雷达图(源自线状几何对象)极坐标常被用于环形数据,特别是时间和方向数据。但由于角度在小的半径中比在大的半径中更难被感知,因此极坐标的视觉感官性并不理想。参数theta决定了哪个变量被映射为角度(默认为x),哪个被映射为半径

以下代码展示了如何通过改变坐标系来把条形图变成饼图或牛眼图。更多示例可参考函数文档

base <- ggplot(mtcars, aes(factor(1), fill = factor(cyl))) +
	geom_bar(width = 1) +
	theme(legend.position = "none") +
	scale_x_discrete(NULL, expand = c(0, 0)) +
	scale_y_continuous(NULL, expand = c(0, 0))

# 堆叠的条形图
base 
# 饼图
base + coord_polar(theta = "y")

# 牛眼图
base + coord_polar()

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

coord_map()地图投影

本质上来说,地图是球形数据的展示。单纯地只是画出经度和纬度是一种误导,所以必须对数据进行“投影”。ggplot2有2种地球投影方法

  • coord_quickmap() 是一个快速且粗糙的近似算法,它设定了宽高比来保证在图像中间1米的纬度和1米的经度有着相同的距离。对于小片的区域,这是一个合理的近似,而且提升了不少速度
# 准备好新西兰的地图
nzmap <- ggplot(map_data("nz"), aes(long, lat, group = group)) +
	geom_polygon(fill = "white", color = "black") +
	xlab(NULL) + ylab(NULL)

# 在直角坐标系画出此地图
nzmap

# 使用宽高比近似算法
nzmap + coord_quickmap()

在这里插入图片描述

在这里插入图片描述

  • coord_map() 使用了mapproj软件包来实现地图投影。它使用和mapproj::mapproject()相同的参数来控制投影效果。它比起coord_quickmap()要慢得多,因为它必须把数据分割成很多部分然后对每一部分进行变换
world <- map_data("world")
worldmap <- ggplot(world, aes(long, lat, group = group)) +
	geom_path() +
	scale_y_continuous(NULL, breaks = (-2:3) * 30, labels = NULL) +
	scale_x_continuous(NULL, breaks = (-4:4) * 45, labels = NULL)

worldmap + coord_map()
# 一些更加疯狂的投影
worldmap + coord_map("ortho")
worldmap + coord_map("stereographic", orientation = c(-90, 0, 0))

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值