r - 如何在 R 中使用 ggplot 绘制绘图区域的“外部”?
问题描述
我最近问了这个问题。但是,我现在要问一个单独的问题,因为我的新问题的范围超出了最后一个问题的范围。
我正在尝试在 ggplot 中创建热图......但是,在我试图绘制的轴之外geom_tile
。问题是我找不到一致的方法来让它工作。例如,我用来绘制的代码是:
library(colorspace)
library(ggplot2)
library(ggnewscale)
library(tidyverse)
asd <- expand_grid(paste0("a", 1:9), paste0("b", 1:9))
df <- data.frame(
a = asd$`paste0("a", 1:9)`,
b = asd$`paste0("b", 1:9)`,
c = sample(20, 81, replace = T)
)
# From discrete to continuous
df$a <- match(df$a, sort(unique(df$a)))
df$b <- match(df$b, sort(unique(df$b)))
z <- sample(10, 18, T)
# set color palettes
pal <- rev(diverging_hcl(palette = "Blue-Red", n = 11))
palEdge <- rev(sequential_hcl(palette = "Plasma", n = 11))
# plot
ggplot(df, aes(a, b)) +
geom_tile(aes(fill = c)) +
scale_fill_gradientn(
colors = pal,
guide = guide_colorbar(
frame.colour = "black",
ticks.colour = "black"
),
name = "C"
) +
theme_classic() +
labs(x = "A axis", y = "B axis") +
new_scale_fill() +
geom_tile(data = tibble(a = 1:9,
z = z[1:9]),
aes(x = a, y = 0, fill = z, height = 0.3)) +
geom_tile(data = tibble(b = 1:9,
z = z[10:18]),
aes(x = 0, y = b, fill = z, width = 0.3)) +
scale_fill_gradientn(
colors = palEdge,
guide = guide_colorbar(
frame.colour = "black",
ticks.colour = "black"
),
name = "Z"
)+
coord_cartesian(clip = "off", xlim = c(0.5, NA), ylim = c(0.5, NA)) +
theme(aspect.ratio = 1,
plot.margin = margin(10, 15.5, 25, 25, "pt")
)
但是,我试图找到一种一致的方法来绘制更像这样的东西(我很快在 Photoshop 中制作了):
我遇到的主要问题是能够操纵绘图区域“外部”的新比例尺的坐标。有没有办法移动外面的瓷砖,以便我可以将它们放置在有意义的区域?
解决方案
在绘图区域外绘图时,总是有两个经典选项:
- 注释/绘图
coord_...(clip = "off")
- 制作不同的情节并将它们组合起来。
以我的拙见,后一种选择通常会提供更大的灵活性和更少的麻烦。
library(colorspace)
library(tidyverse)
library(patchwork)
asd <- expand_grid(paste0("a", 1:9), paste0("b", 1:9))
df <- data.frame(
a = asd$`paste0("a", 1:9)`,
b = asd$`paste0("b", 1:9)`,
c = sample(20, 81, replace = T)
)
# From discrete to continuous
df$a <- match(df$a, sort(unique(df$a)))
df$b <- match(df$b, sort(unique(df$b)))
z <- sample(10, 18, T)
# set color palettes
pal <- rev(diverging_hcl(palette = "Blue-Red", n = 11))
palEdge <- rev(sequential_hcl(palette = "Plasma", n = 11))
# plot
p_main <- ggplot(df, aes(a, b)) +
geom_tile(aes(fill = c)) +
scale_fill_gradientn("C",colors = pal,
guide = guide_colorbar(frame.colour = "black",
ticks.colour = "black")) +
theme_classic() +
labs(x = "A axis", y = "B axis")
p_bottom <- ggplot() +
geom_tile(data = tibble(a = 1:9, z = z[1:9]),
aes(x = a, y = 0, fill = z, height = 0.3)) +
theme_void() +
scale_fill_gradientn("Z",limits = c(0,10),
colors = palEdge,
guide = guide_colorbar(
frame.colour = "black", ticks.colour = "black"))
p_left <- ggplot() +
theme_void()+
geom_tile(data = tibble(b = 1:9, z = z[10:18]),
aes(x = 0, y = b, fill = z, width = 0.3)) +
scale_fill_gradientn("Z",limits = c(0,10),
colors = palEdge,
guide = guide_colorbar( frame.colour = "black", ticks.colour = "black"))
p_left + p_main +plot_spacer()+ p_bottom +
plot_layout(guides = "collect",
heights = c(1, .1),
widths = c(.1, 1))
由reprex 包于 2021-02-21 创建(v1.0.0)
推荐阅读
- r - 解释 walktrap.community 结果
- arrays - 如何验证此 SMT 规范,其中包含数组选择作为 Z3 中递归函数的参数?
- regex - 正则表达式:标签匹配
- laravel - Laravel Livewire 更新模型字段
- bazel - 使用 Bazel 构建 Drake_last_sha_with_original_matlab Atlas 时出现问题
- json - 赛普拉斯 REST 调用 - 如何处理 JSON 响应正文中的字段?
- c - 1 字刽子手代码,无重复字母(业余)。错误是,它不需要比较第一个字母,我不知道为什么。想知道为什么?
- scala - 来自文本文件 java.lang.NumberFormatException 的 scala RDD:对于输入字符串:“0.5312”
- python - 定义 CNN 模型的架构
- python - 使用什么类型的 Qt 图表来创建此图像中的图表