r - 我可以在 R 中的 ggplot 中分隔两个填充图例吗?
问题描述
我有一个数据集,我试图在 R 中使用 ggplot2 绘制,我想以两种不同的方式使用填充美学两次(一个变量是/否,另一个变量缩放)。
一个示例数据集:
df <- data.frame(Season = rep(c('a', 'b', 'c', 'd'), times = 3),
Scenario = rep(c('S1', 'S2', 'S3'), each = 4),
meanA = rep(1, 12), meanB = rep(2,12))
我想要点为meanA
被填充和点为meanB
空。Scenario
我希望这两组的颜色都可以缩放,我也希望填充meanA
可以缩放Scenario
。我已经设法以我希望的方式获得图表:
ggplot(df, aes(Season, meanA)) +
geom_point(aes(color = Scenario, fill = Scenario), shape = 24,
position = position_dodge(width = 0.4)) +
geom_point(aes(y = meanB, color = Scenario), fill = NA, shape = 25,
position = position_dodge(width = 0.4)) +
ylim(0,3)
但是,我遇到的问题是我想要两个图例:一个具有两种形状(填充三角形,空三角形),另一个具有按场景缩放的填充/颜色。截至目前,该图只有一个图例,其中填充符号和未填充符号重叠。我怎样才能让图例看起来像我想要的那样?
解决方案
通过一些重塑和guides
功能,您可以到达那里:
library(tidyr)
library(dplyr)
library(ggplot2)
df <- data.frame(Season = rep(c('a', 'b', 'c', 'd'), times = 3),
Scenario = rep(c('S1', 'S2', 'S3'), each = 4),
meanA = rep(1, 12), meanB = rep(2,12))
df2 <- df %>%
pivot_longer(
meanA:meanB, names_to = "var", values_to = "val"
)
ggplot(df2, aes(Season, val, shape = var, color = Scenario)) +
geom_point(data = . %>% filter(var == "meanA"), aes(fill = Scenario),
position = position_dodge(width = 0.4)) +
geom_point(data = . %>% filter(var == "meanB"), aes(fill = NULL),
position = position_dodge(width = 0.4)) +
scale_shape_manual(values = c(24, 25)) +
guides(
shape = guide_legend(override.aes = list(fill = c("#F8766D", NA)))
) +
ylim(0,3)
推荐阅读
- r - 获取 `parse_date_time` 以识别个位数分钟
- ruby - 在 Ruby (.accdb) 中与 MS Access 的 ODBC 连接
- .htaccess - GAE 应用程序 app.yaml VS .htaccess
- sql-server - SQL Server 条件案例未按预期工作
- html - 从 html 页面获取“href=link”并使用 vba 导航到该链接
- python - 抓取纳斯达克网站
- facebook-messenger - click to messenger facebook adcreative with page_welcome_message 例子有问题
- pdf - 如何使用 iText 查找 PDF 中的所有矩形
- python - Pandas - 将多行从另一个 DF 映射到多列
- java - 如何通过Java代码为mongoDB实现嵌套查询