我正在尝试制作一个 ggplot,其中 y 轴上分类变量的顺序为 1) 按另一个变量的值重新排序,然后 2) 轴文本交换为另一个值,其中给定的新值级别标签可以有多个来自原始变量的对应值。这是完成第一部分的可重现示例:
df <- data.frame(id = rep(letters[1:5], each=10),
id_2 = rep(c('group1', 'group2', 'group1', 'group3', 'group4'), each=10),
date = rep(seq(0, 9), 5),
start_point = rep(rnorm(5, 0, 1), each=10),
change_rate = rep(rnorm(5, 0, 1), each=10),
variance = rnorm(50, 0, 1))
df$fill_val <- df$start_point + df$date*df$change_rate + df$variance
ggplot(df, aes(x=date, y=reorder(id, fill_val), fill=fill_val)) +
geom_tile()
这会产生:
现在,我想用 id_2
中找到的值替换 y 轴上的标签。请注意,您当然可以在此玩具示例中手动执行此操作,如下所示:
ggplot(df, aes(x=date, y=reorder(id, fill_val), fill=fill_val)) +
geom_tile() +
scale_y_discrete(breaks=c('d', 'b', 'a', 'e', 'c'),
labels=c('group3', 'group2', 'group1', 'group4', 'group1'))
制作:
但对于真实数据,我需要重复执行此操作,并且在某些图中,y 轴上可能有几十个值,因此不能像上面那样手动修复。
最佳答案
这可以通过标签的命名向量来实现。该载体可以使用例如构建tibble::deframe
:
set.seed(42)
df <- data.frame(id = rep(letters[1:5], each=10),
id_2 = rep(c('group1', 'group2', 'group1', 'group3', 'group4'), each=10),
date = rep(seq(0, 9), 5),
start_point = rep(rnorm(5, 0, 1), each=10),
change_rate = rep(rnorm(5, 0, 1), each=10),
variance = rnorm(50, 0, 1))
df$fill_val <- df$start_point + df$date*df$change_rate + df$variance
library(ggplot2)
library(tibble)
library(dplyr)
labels <- df %>%
select(id, id_2) %>%
distinct() %>%
tibble::deframe()
ggplot(df, aes(x=date, y=reorder(id, fill_val), fill=fill_val)) +
geom_tile() +
scale_y_discrete(labels = labels)
关于r - 如何在 ggplot 中按值重新排序轴后更改轴文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65740329/