r - 在ggplot中按值重新排序轴后如何更改轴文本
问题描述
我正在尝试制作一个 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()
这会产生:
现在,我想将 y 轴上的标签替换为id_2
. 请注意,您当然可以在这个玩具示例中手动执行此操作,如下所示:
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)
推荐阅读
- iphone - 在 iphone se 上无法正确显示
- python - Tkinter 和 GUI 大小的问题
- xml - 如何使用附加 if 条件从 xml 中删除行
- reactjs - 如何在使用 setInterval() 方法更改组件背景的同时在 React 中添加过渡
- airflow - 无法在 Apache HOP 工作流中解压缩 .gz 文件
- python - 我可以从 python 脚本访问 postgresql 数据库并使用 SQL 将其查询到 pandas 数据框中吗?
- css - 为什么我需要设置样式而不是使用类?
- python - OpenCV 图像距离计算故障排除
- oracle - 永久更改 NLS_TERRITORY 和 NLS_LANGUAGE
- c# - 使用 Chrome 和 Selenium 设置 LocalStorage