ggplot - 多个图例排列

2024-01-26

我想在 ggplot 中排列具有多行和多列的多个图例。然而目前,从文档中我只能决定方向或操作 1 个图例内的行/列。我是否忽略了什么?感谢您提供解决方案的任何参考点。 这是示例代码以及我所做的和预期的结果。

data <- seq(1000, 4000, by=1000)
colorScales <- c("#c43b3b", "#80c43b", "#3bc4c4", "#7f3bc4")
names(colorScales) <- data
ggplot() +
    geom_point(aes(x=data, y=data, color=as.character(data), fill=data, size=data),
               shape=21) +
    scale_color_manual(name="Legend 1",
                      values=colorScales) +
    scale_fill_gradientn(name="Legend 2",
                          labels=comma, limits=c(0, max(data)),
                          colours=rev(c("#000000", "#FFFFFF", "#BA0000")),
                         values=c(0, 0.5, 1)) +
    scale_size_continuous(name="Legend 3") +
    theme(legend.direction = "vertical", legend.box = "vertical")

Output vertical legend: enter image description here

ggplot() +
    geom_point(aes(x=data, y=data, color=as.character(data), fill=data, size=data),
               shape=21) +
    scale_color_manual(name="Legend 1",
                       values=colorScales) +
    scale_fill_gradientn(name="Legend 2",
                         labels=comma, limits=c(0, max(data)),
                         colours=rev(c("#000000", "#FFFFFF", "#BA0000")), 
                         values=c(0, 0.5, 1)) +
    scale_size_continuous(name="Legend 3") +
    theme(legend.direction = "vertical", legend.box = "horizontal")

Output horizontal legend enter image description here

ggplot() +
    geom_point(aes(x=data, y=data, color=as.character(data), fill=data, size=data),
               shape=21) +
    scale_color_manual(name="Legend 1",
                       values=colorScales) +
    scale_fill_gradientn(name="Legend 2",
                         labels=comma, limits=c(0, max(data)),
                         colours=rev(c("#000000", "#FFFFFF", "#BA0000")), 
                         values=c(0, 0.5, 1)) +
    guides(colour = guide_legend(nrow = 2, byrow = T, override.aes=list(size=4))) +
    guides(size = guide_legend(nrow = 2, byrow = T)) +
    scale_size_continuous(name="Legend 3") +
    theme(legend.direction = "vertical", legend.box = "vertical")

Output legend with vertical layout, 2 columns within each legend: enter image description here

我想要的是这样的:


这个想法是单独创建每个图(color, fill & size)然后提取他们的传说并以所需的方式将它们与主要情节结合在一起。

查看更多关于cowplot包裹here https://cran.r-project.org/web/packages/cowplot/vignettes/shared_legends.html& 这patchwork包裹here https://github.com/thomasp85/patchwork

library(ggplot2)
library(cowplot)   # get_legend() & plot_grid() functions
library(patchwork) # blank plot: plot_spacer()

data <- seq(1000, 4000, by = 1000)
colorScales <- c("#c43b3b", "#80c43b", "#3bc4c4", "#7f3bc4")
names(colorScales) <- data

# Original plot without legend
p0 <- ggplot() +
  geom_point(aes(x = data, y = data, 
                 color = as.character(data), fill = data, size = data),
             shape = 21
  ) +
  scale_color_manual(
    name = "Legend 1",
    values = colorScales
  ) +
  scale_fill_gradientn(
    name = "Legend 2",
    limits = c(0, max(data)),
    colours = rev(c("#000000", "#FFFFFF", "#BA0000")),
    values = c(0, 0.5, 1)
  ) +
  scale_size_continuous(name = "Legend 3") +
  theme(legend.direction = "vertical", legend.box = "horizontal") +
  theme(legend.position = "none")

# color only
p1 <- ggplot() +
  geom_point(aes(x = data, y = data, color = as.character(data)),
             shape = 21
  ) +
  scale_color_manual(
    name = "Legend 1",
    values = colorScales
  ) +
  theme(legend.direction = "vertical", legend.box = "vertical")

# fill only
p2 <- ggplot() +
  geom_point(aes(x = data, y = data, fill = data),
             shape = 21
  ) +
  scale_fill_gradientn(
    name = "Legend 2",
    limits = c(0, max(data)),
    colours = rev(c("#000000", "#FFFFFF", "#BA0000")),
    values = c(0, 0.5, 1)
  ) +
  theme(legend.direction = "vertical", legend.box = "vertical")

# size only
p3 <- ggplot() +
  geom_point(aes(x = data, y = data, size = data),
             shape = 21
  ) +
  scale_size_continuous(name = "Legend 3") +
  theme(legend.direction = "vertical", legend.box = "vertical")

获取所有传奇

leg1 <- get_legend(p1)
leg2 <- get_legend(p2)
leg3 <- get_legend(p3)

# create a blank plot for legend alignment 
blank_p <- plot_spacer() + theme_void()

结合传奇

# combine legend 1 & 2
leg12 <- plot_grid(leg1, leg2,
                   blank_p,
                   nrow = 3
)

# combine legend 3 & blank plot
leg30 <- plot_grid(leg3, blank_p,
                   blank_p, 
                   nrow = 3
)

# combine all legends
leg123 <- plot_grid(leg12, leg30,
                    ncol = 2
)

把所有东西放在一起

final_p <- plot_grid(p0,
                     leg123,
                     nrow = 1,
                     align = "h",
                     axis = "t",
                     rel_widths = c(1, 0.3)
)

print(final_p)

创建于 2018-08-28代表包 https://reprex.tidyverse.org(v0.2.0.9000)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ggplot - 多个图例排列 的相关文章

随机推荐

  • Django REST Framework 验证错误:“输入有效的 URL。”

    在我的 Django REST Framework 项目中 我有一个模型类 用于保存 Django 应用程序将在后台任务中抓取的服务 class Service models Model name models CharField max
  • URL 特定编码

    我尝试重新创建 URL 但找不到编码函数 Edit 背景 该字符串用于 API 当然没有文档 我尝试使用原始网址编码但似乎只有原始的编码 解码功能有效 所以我必须找到它是什么 input 2 3 word 888 gt word2 AND
  • CGridView 中的格式化日期过滤器

    我在 CGridView 中将日期显示为 22 6 2012 22 53 array name gt date value gt date j n Y G i strtotime model gt date 但在我的过滤器中 我需要以这种格
  • 如何在 SQL 中从另一个表获取计数?

    我有以下关于 SQL 的表 Mensajes IdMensaje int PK NOT NULL IdCliente int CorreoCliente varchar 100 CorreosAdicionales varchar MAX
  • 将滑动触摸从 UIView 传递到底层 UIScrollView 以实现正确滚动

    我的情况与这两篇文章类似 1907297 http www stackoverflow com questions 1907297 AND 689684 http www stackoverflow com questions 689684
  • NineOldAndroids,旋转或移动后不可点击视图

    I use 九老机器人 http nineoldandroids com2 4 0 为对象设置动画 主要用于运动和变换的控制 在 Android 4 0 及更高版本上一切正常 但在以前的版本 2 1 2 3 上 动画元素没有获得焦点并且不可
  • 在 Rails 中调试? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何在 RubyonRails 中 相对 成功地调试 我知道并广泛使用以下内容 Terminal 导轨控制台 开发者工具 日志文件 生产 开发
  • 删除 pandas DataFrame 列中字符串条目的末尾

    我有一个 pandas Dataframe 其中一列是文件列表 import pandas as pd df pd read csv fname csv df head filename A B C fn1 txt 2 4 5 fn2 tx
  • NA 正在箱线图 ggplot2 中绘制

    我正在尝试在 ggplot2 中绘制一个简单的箱线图 我有物种丰富度与土地利用类别 但是 我的数据中有 2 个 NA 出于某种奇怪的原因 它们被策划了 即使它们被 R 理解为 NA 有什么建议删除它们吗 我正在使用的代码是 ggplot d
  • ActiveRecord可以远程连接PostgreSQL并保护DB密码吗?

    我在远程 VPS 服务器 CentOS 5 上有一个 PostgreSQL 数据库 我想连接一个 Rails 应用程序 从我的本地 Mac 笔记本电脑连接到它 在我的笔记本电脑上 我安装了 ActiveRecord PostgreSQL 适
  • Apache solr 频繁添加/编辑/删除记录

    我正在考虑使用 Apache Solr 在我的数据库中 我将有大约 10 000 000 条记录 我将使用它的最坏情况有大约 20 个可搜索 可排序字段 我的问题是这些字段在一天中可能会频繁更改值 例如 在我的数据库中 我可能会同时更改 1
  • 将数组插入 mysql 数据库列

    我正在尝试将表单中的多选下拉列表中的值插入到 mysql 数据库列中 例如 下拉列表将选择一个或多个选项 然后在发布表单时将数据插入到 mysql 数据库中的一列中 我陷入了如何插入数据的困境 如果你想插入单行 那么你可以使用 implod
  • 如何获取使用 ChromeDriver 在 Azure 云服务中工作的 C# azure 服务

    我编写了一个使用 Selenium WebDriver ChromeDriver 的 C Azure 云服务 但当我将其部署到 Azure 时它不起作用 在本地运行良好 可能是因为我安装了 Chrome 我使用我的服务部署 chromedr
  • 如何添加自定义键盘

    我做了一个简单的应用程序 我的应用程序包含 10 个文本字段 我需要的是我需要隐藏默认键盘我放置手动键像这样 http b imagehost org download 0994 keypad 我该如何完成这个按键作为我的应用程序的键盘 任
  • gdb:打印二维fortran数组[重复]

    这个问题在这里已经有答案了 使用 GDB 在 Fortran 代码中打印二维数组的值时遇到问题 gdb print var 1 2 no such vector element 经过广泛的搜索后 我发现了许多关于该问题的帖子 日期为 200
  • 我可以为我的函数和类使用 PHP 保留名称吗?

    我想创建一个名为 new 的函数和一个名为 case 的类 我可以用 PHP 做到这一点吗 No http www php net manual en reserved keywords php you http codepad org z
  • 共享两个组合框的数据源

    我的 GUI 中有多个组合框 它们都需要数据 这些数据会随机变化 因此需要一种快速方法来保持所有值同步 我遇到了 DefaultComboBoxModel 它实际上非常适合 唯一的问题是 我需要组合框彼此独立 这意味着 如果我在其中选择一个
  • 页面重新加载时 Angular 应用程序中的 Grunt URL 重写

    Grunt 文件中的 livereload 块如下所示 livereload options open true middleware function connect options middleware var optBase type
  • 默认参数和非默认参数的顺序

    在Python中 我知道默认参数出现在末尾 并且非默认参数不能跟在默认参数后面 没事儿 例如 gt gt gt def foo x 0 y return x y SyntaxError non default argument follow
  • ggplot - 多个图例排列

    我想在 ggplot 中排列具有多行和多列的多个图例 然而目前 从文档中我只能决定方向或操作 1 个图例内的行 列 我是否忽略了什么 感谢您提供解决方案的任何参考点 这是示例代码以及我所做的和预期的结果 data lt seq 1000 4