[英]Set custom non-linear scale bar with ggplot2
我在网上找不到任何答案。
我有这个情节:
a = data.frame(x=c(1,2,3,3,4,5,3,2,3,4),
y=c(1,2,3,6,4,5,3,2,3,2),
z=c(-4,-3.5,-2,-1,0,0.2,0.45,0.6,0.9,1))
ggplot()+
geom_point(data=a, aes(x,y,fill=z),
colour = "black", pch = 21, size = 3, stroke = 0.1)+
scale_fill_gradientn(colors = c("blue","white","red"),
breaks=c(-5,-4,-3,-2,-1,0,0.2,0.4,0.6,0.8,1),
limits=c(-5,1),
guide = guide_colorbar(barwidth = 0.8, barheight = 18),
oob = scales::squish,
trans = "identity")
这给了我这个比例尺:
当然这是我所期望的,因为比例是线性的,并且我定义了这些中断。
但是,我想知道如何获得如下所示的比例尺:
一种可能的解决方法是在将z值映射到fill
参数之前重新缩放它们,以使这些值对应于线性彩条,然后根据预先缩放的值标记图例:
a$z.rescaled <- ifelse(a$z < 0, a$z / 5, a$z)
> a
x y z z.rescaled
1 1 1 -4.00 -0.80
2 2 2 -3.50 -0.70
3 3 3 -2.00 -0.40
4 3 6 -1.00 -0.20
5 4 4 0.00 0.00
6 5 5 0.20 0.20
7 3 3 0.45 0.45
8 2 2 0.60 0.60
9 3 3 0.90 0.90
10 4 2 1.00 1.00
ggplot()+
geom_point(data = a,
aes(x, y, fill = z.rescaled),
colour = "black", pch = 21, size = 3, stroke = 0.1) +
scale_fill_gradientn(name = "",
colors = c("blue", "white", "red"),
breaks = seq(-1, 1, 0.2),
labels = c(seq(-5, 0, 1), seq(0.2, 1, 0.2)),
limits = c(-1, 1),
guide = guide_colorbar(barwidth = 0.8, barheight = 18),
oob = scales::squish)
您可以使用cut
和手动定义的中断将连续的z
变量分解为离散变量,然后手动或使用预定义的调色板为其提供不同的色标。
唯一棘手的部分是清理标签,我使用正则表达式模式提取了每个范围的最后一个数字。 从技术上讲,这些标签并不完全准确,因为每种颜色代表一个值的范围,而不仅仅是一个值,但是我试图模仿您的示例。 您可以跳过我放到scale_color_brewer
的标签功能,而只使用它们来的标签,其格式为( scale_color_brewer
]。
library(tidyverse)
a = data.frame(x=c(1,2,3,3,4,5,3,2,3,4),
y=c(1,2,3,6,4,5,3,2,3,2),
z=c(-4,-3.5,-2,-1,0,0.2,0.45,0.6,0.9,1))
a$brk <- cut(a$z, breaks = c(-6:0, seq(0.2, 1, by = 0.2)), include.lowest = T)
ggplot(a, aes(x = x, y = y, fill = brk)) +
geom_point(shape = 21, size = 3, stroke = 0.1, color = "black") +
scale_fill_brewer(palette = "RdBu",
guide = guide_legend(reverse = T),
direction = -1, drop = F,
labels = function(x) str_extract(x, "(?<=,).+(?=\\])"))
一个问题是,这给了一个带有圆圈的图例,因为它采用了geom_point
的形状。 我搞砸了添加guide = guide_legend(override.aes = list(shape = 22))
和其他形状来代替正方形,但是我希望它看起来更像是一个普通的图例。 不过,您可以从geom_col
的填充中获得更传统的图例,因此我使用了从此答案中挑选的技巧来制作不可见的geom_col
,并关闭了geom_point
的图例,仅使用geom_col
创建的geom_col
。
ggplot(a, aes(x = x, y = y)) +
geom_point(aes(fill = brk), shape = 21, size = 3, stroke = 0.1, color = "black", show.legend = F) +
geom_col(aes(fill = brk), alpha = 0) +
scale_fill_brewer(palette = "RdBu",
guide = guide_legend(reverse = T, override.aes = list(alpha = 1)),
direction = -1, drop = F,
labels = function(x) str_extract(x, "(?<=,).+(?=\\])"))
由reprex软件包 (v0.2.0)创建于2018-05-25。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.