编辑:清除描述和代码示例,添加绘图。
我有一个数据集,其中包含几种动物的位置。
我为每只动物创建了位置散点图网格。因为图的 x y 是距离,所以我想使每个图本身的 x y 保持相同的比例(因此距离没有失真)和跨图(这样我可以比较具有相同比例的不同图)。
Facet 是一个自然的选择,它可以与coord_fixed()
。然而,当数据中存在异常值(可能是错误)时,情况会变得更加复杂。我修改了 @Mark Peterson 很好的答案,添加了一些异常点。
set.seed(8675309)
df <-
data.frame(
x = runif(40, 1, 20)
, y = runif(40, 100, 140)
, ind = sample(LETTERS[1:4], 40, TRUE)
)
# add some outliers to stretch the plot
outliers <- data.frame(x = c(-100, 30, 60,-50),
y = c(20, 200, -100, 500),
ind = LETTERS[1:4])
df <- rbind(df, outliers)
ggplot(df , aes(x = x, y = y)) +
geom_point() +
facet_wrap(~ind) +
coord_fixed()
This is what we got.
1.使用 coord_fixed() 绘制面图:比例一致,轴对齐
该图满足比例比例要求和比例一致要求,并且所有轴对齐,即所有 xlim ylim 相同。这很有用,因为它可以显示彼此的相对位置。
我还想检查每个图的模式并进行比较。保持面图的相对位置,我想添加另一个具有一致比例但轴未对齐的图。如果单独绘制每个图,它将选择 xlim ylim 来覆盖数据,而无需对齐要求。所以我只需要绘制每个图,然后将它们排列起来gridExtra
or cowplot
.
然后,为了处理异常值,我们的计划是添加一个缩放按钮来放大所有图(图将位于 Shiny 应用程序中)。
我们决定将每个图都以其质心为中心。虽然这种方式会浪费更多的空间,但所有绘图都正确居中,缩放它们将显示所有绘图的大部分,并且它们在比例上仍然具有可比性。
我有一个函数可以将每个图调整到其中位中心,有点类似于@Mark Peterson 代码。
我知道中位中心在 2D 点中没有明确定义,但它足以满足我的需求。因为我需要单独调整每个图,所以我不能再使用facet。
expand_1D_center <- function(vec){
center <- median(vec)
new_diff <- max(center - min(vec),
max(vec) - center)
return(c(new_min = center - new_diff,
new_max = center + new_diff))
}
# given x y vectors, get new x y lim to make centroid center
expand_2D_center <- function(x_vec, y_vec){
return(list(xlim = expand_1D_center(x_vec),
ylim = expand_1D_center(y_vec)))
}
# plot each with center adjusted
id_vector <- sort(unique(df$ind))
g_list <- vector("list", length = length(id_vector))
for (i in seq_along(id_vector)) {
data_i <- df[df$ind == id_vector[i], ]
new_lim <- expand_2D_center(data_i$x, data_i$y)
g_list[[i]] <- ggplot(data = data_i, aes(x, y)) +
geom_point() +
coord_fixed(xlim = new_lim$xlim, ylim = new_lim$ylim)
}
grid.arrange(grobs = g_list, ncol = 2, respect=TRUE)
2. 中心调整图,每个图的 xy 比例都正确,但各图之间不一致。
我希望现在更清楚了。当我专注于当前问题而忘记了解释我们的需求所需的整个历史时,我的第一篇文章没有清楚地说明问题。
@Mark Peterson 的回答似乎解决了这个问题,我将进一步阅读代码来验证。
Thanks!
编辑:为了提供一些背景信息,我在此处添加了真实数据的绘图:
所有海鸥都在一个图中的概览图,请注意,有一些异常值拉伸了图
这是分面图,它对于对齐所有内容很有用。
这是每个比例都正确的单独图,未在图之间对齐。
这个图的每个图都以质心为中心。我打算同时放大它们。唯一的问题是各图的比例不一致。
编辑:我在我的数据上尝试了@Mark Peterson代码,它裁剪了一些点,但图是一致的。,可能是因为我的数据具有更大的值,所以原始填充不够大。
马克在每个图的所有图上使用最大 xrange,因此每个图都有相同的范围。我的代码尝试使每个绘图都适合其模式,但要将它们放置在具有一致比例的网格内,需要使用最大的画布缩小绘图,或填充最小的绘图。将每个图的范围设置为相同实际上具有类似的效果,但实现起来要简单得多。