使用 ggplot2 中的 geom_tile 对数据框进行排序以创建 "quilt" 图表
Sorting a dataframe to create a "quilt" chart using geom_tile in ggplot2
我希望创建一个“被子”图表,以显示每年表现最佳的类别。这是一个相当常见的图表,但我不知道如何在 R 中生成它。下面是一个简单的可重现示例。
fruit <- c("Apples", "Oranges", "Pears", "Peaches")
yield2020 <- c("200", "100", "250", "125")
yield2021 <- c("40", "90", "85", "100")
yield2022 <- c("150", "110", "150", "170")
DF <- data.frame (Fruit, yield2020, yield2021, yield2022)
在DF中可以看到,每年苹果、橙子、桃子、梨子的产量都不同。我希望创建一个 geom_tile 图表,显示 2020 年表现最佳的梨,2021 年的桃子和 2022 年的桃子,其他水果组以颜色编码显示在其下方。非常感谢任何建议!
I found the below example of a different quilt chart, which might help frame my ultimate goal here
实现所需结果的一个选择是将数据重塑为长数据并添加一个包含每年排名的列,然后可以将其映射到 y
aes。此外,我使用 scale_y_reverse
将表现最好的人放在图表的顶部:
library(dplyr)
library(tidyr)
library(ggplot2)
df <- DF |>
pivot_longer(-fruit, names_to = "year", names_prefix = "yield") |>
mutate(across(c(year, value), as.numeric)) |>
group_by(year) |>
mutate(rank = rank(-value, ties.method = "first"))
ggplot(df, aes(year, rank, fill = fruit)) +
geom_tile() +
geom_text(aes(label = paste(fruit, value, sep = "\n"))) +
scale_y_reverse() +
guides(fill = "none")
我希望创建一个“被子”图表,以显示每年表现最佳的类别。这是一个相当常见的图表,但我不知道如何在 R 中生成它。下面是一个简单的可重现示例。
fruit <- c("Apples", "Oranges", "Pears", "Peaches")
yield2020 <- c("200", "100", "250", "125")
yield2021 <- c("40", "90", "85", "100")
yield2022 <- c("150", "110", "150", "170")
DF <- data.frame (Fruit, yield2020, yield2021, yield2022)
在DF中可以看到,每年苹果、橙子、桃子、梨子的产量都不同。我希望创建一个 geom_tile 图表,显示 2020 年表现最佳的梨,2021 年的桃子和 2022 年的桃子,其他水果组以颜色编码显示在其下方。非常感谢任何建议!
I found the below example of a different quilt chart, which might help frame my ultimate goal here
实现所需结果的一个选择是将数据重塑为长数据并添加一个包含每年排名的列,然后可以将其映射到 y
aes。此外,我使用 scale_y_reverse
将表现最好的人放在图表的顶部:
library(dplyr)
library(tidyr)
library(ggplot2)
df <- DF |>
pivot_longer(-fruit, names_to = "year", names_prefix = "yield") |>
mutate(across(c(year, value), as.numeric)) |>
group_by(year) |>
mutate(rank = rank(-value, ties.method = "first"))
ggplot(df, aes(year, rank, fill = fruit)) +
geom_tile() +
geom_text(aes(label = paste(fruit, value, sep = "\n"))) +
scale_y_reverse() +
guides(fill = "none")