如何命名 R 图中由垂直线分隔的 x 轴部分(包 ggplot2)?

2023-11-20

我创建了一个堆积面积图ggplot2并添加了垂直线在某些位置上x-axis.

我现在想命名sections由这些垂直线分隔开。它的一个示例可能看起来像示例图中所示。也欢迎其他解决方案。 我有一个向量breaks (x-axis)以及间隔名称的向量。

Code:

library(ggplot2)
d <- read.delim(...)
x_breaks = c(-3999,1,599,4076,7557,11556)

png(output, width=800, height=400)

ggplot(d, aes(x=p, y=c, group=Groups, fill=Groups)) +
geom_area(position="stack") +
opts(title="testtestest",
...) +
scale_x_continuous(expand=c(0,0), breaks=x_breaks) +
scale_y_continuous(expand=c(0,0)) +
geom_vline(xintercept=x_breaks[which(x_breaks != min(x_breaks) & x_breaks != max(x_breaks))])

dev.off()

How to name the sections seperated by the vertical lines?


如果没有数据,就很难重现您的示例(您的休息时间等)。但以下内容应该可以帮助您入门。

一种相当简单的解决方案是使用 ggplot2annotate()函数将文本注释添加到垂直线中间的绘图面板。

# Load packages
library (ggplot2)
library(grid)

# Some data
df = data.frame(x = 1:10, y = 1:10)

# Base plot
p <- ggplot(df, aes(x,y)) + geom_point() + 
  scale_x_continuous(limits = c(0, 11), expand = c(0,0)) +
  geom_vline(xintercept = 3) + geom_vline(xintercept = 7)

# Add the annotations
p + annotate("text", x = .5*(0+3), y = 11, label = "Part 1") +
     annotate("text", x = .5*(3+7), y = 11, label = "Part 2") +
     annotate("text", x = .5*(7+11), y = 11, label = "Part 3")

结果是:

enter image description here

或者就注释而言接近示例图的解决方案。它用annotation_custom()绘制线条并将文本放置在绘图面板之外。即使注释是在绘图面板之外绘制的,注释的位置也是根据数据坐标进行的。基础图中的底部边距被加宽,以便为注释提供空间。该解决方案需要代码来覆盖 ggplot 将绘图元素剪切到绘图面板的功能。

Update opts已弃用;使用theme反而。

# Base plot
p <- ggplot(df, aes(x,y)) + geom_point() + 
  scale_x_continuous(limits = c(0, 11), expand = c(0,0)) +
  geom_vline(xintercept = 3) + geom_vline(xintercept = 7) +
  theme(plot.margin = unit(c(1,1,4,1), "lines"))

# Create the text Grobs
Text1 = textGrob("Part 1")
Text2 = textGrob("Part 2")
Text3 = textGrob("Part 3")

# Add the annotations
# Segment 1
p1 = p + 
    annotation_custom(grob = linesGrob(), xmin = 0, xmax = 0, ymin = -1, ymax = -.75) +
    annotation_custom(grob = linesGrob(), xmin = 0, xmax = 3, ymin = -1, ymax = -1) +
    annotation_custom(grob = linesGrob(), xmin = 3, xmax = 3, ymin = -1, ymax = -.75) +
    annotation_custom(grob = Text1,  xmin = 0, xmax = 3, ymin = -1.25, ymax = -1.25)

# Segment 2
p1 = p1 + 
    annotation_custom(grob = linesGrob(), xmin = 3, xmax = 7, ymin = -1, ymax = -1) +
    annotation_custom(grob = linesGrob(), xmin = 7, xmax = 7, ymin = -1, ymax = -.75) +
    annotation_custom(grob = Text2,   xmin = 3, xmax = 7, ymin = -1.25, ymax = -1.25) 

# Segment 3
p1 = p1 + 
    annotation_custom(grob = linesGrob(), xmin = 7, xmax = 11, ymin = -1, ymax = -1) +
    annotation_custom(grob = linesGrob(), xmin = 11, xmax = 11, ymin = -1, ymax = -.75) +
    annotation_custom(grob = Text3,  xmin = 7, xmax = 11, ymin = -1.25, ymax = -1.25)

# Code to override clipping
gt <- ggplot_gtable(ggplot_build(p1))
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)

结果是:

enter image description here

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

如何命名 R 图中由垂直线分隔的 x 轴部分(包 ggplot2)? 的相关文章

随机推荐

  • 有没有办法以编程方式生成 CouchDB cookie?

    我正在开发一个应用程序 它将使用 CouchDB 为用户存储一些数据 但我不希望用户直接登录CouchDB 我将有一个应用程序客户端 移动 网络 一个应用程序服务器和 CouchDB 服务器 客户端应用程序将向应用程序服务器进行身份验证 然
  • NullPointerException:使用 GSON 在 JAVA 中解析 JSON

    我想使用 Api GSON 通过 java 解析 JSON 文件以获取 JSON 文件的最后一个字段 描述符 json Teleservice 1 Record 1 method name mehdi method params param
  • 从 vim 中运行 PHP 文件

    是否可以在 vim 中运行 PHP 文件 我在这里尝试做的是有一个快捷方式 这样每当我需要运行我正在编辑的文件时 就可以跳过退出 vim 并手动调用 PHP 解释器 是的 做你想做的事是可能的 两者都从 vim 中运行 PHP 并创建快捷方
  • 跨域发布到 ASP.Net MVC 应用程序

    我正在开发一个应用程序 其中 HTML 和 javascript 块被传递到不同的客户端 我可以通过将以下内容添加到 Web 配置文件来获取 html javascript 块
  • JavaFX 使对象可见但不消耗(忽略)点击

    标题说明了一切 我在 JavaFX 中有一个矩形 用于透明 不透明效果 但我希望人们能够 点击 它 因此 当我说单击时 我的意思是当您单击它时 Java 应该假装它不存在 而是 单击 该对象下方的任何内容 当您使用 setVisible f
  • 与免费的 Java 分析器相比,商业 Java 分析器有哪些优势? Netbeans 中的那个?

    有时 我必须对 Java 代码进行一些分析工作 我想知道为什么我应该让我的老板使用商业分析器进行调查 而不是只使用 Netbeans 或 JConsole 中的分析器 值得投资的杀手级功能是什么 根据我使用 JProfiler 的经验 它是
  • 未捕获的类型错误:对象 [object Object] 没有方法“apply”

    我在我正在创建的新网站上收到此未捕获的类型错误 但我无法找出导致该错误的原因 我在下面的链接中重新创建了该问题 如果您查看浏览器的 JS 控制台 您会看到发生错误 但没有其他情况发生 http jsfiddle net EbR6D 2 Co
  • 有状态 lambda 表达式和无状态 lambda 表达式有什么区别?

    根据 OCP 一书 必须避免有状态操作 也称为有状态 lambda 表达式 书中提供的定义是 有状态 lambda 表达式是一种其结果取决于管道执行期间可能更改的任何状态的表达式 他们提供了一个示例 其中使用并行流将固定的数字集合添加到同步
  • Android 视频不适合视频视图纵向的宽度并且横向不占据全屏

    Android 视频在纵向时不适合视频视图的宽度 如何使视频的宽度在纵向时适合视频视图的宽度 当我将屏幕方向更改为横向时 我希望视频填充像 YouTube 应用程序一样全屏 当处于纵向时 视频将从屏幕的顶部到中间开始 而当处于横向时 视频将
  • 如何在OnRender中重绘或刷新?

    我想动态地画一些东西 以下代码显示了我的 OnRender 我正在程序中需要的地方设置 DrawItem 但当我打电话时DrawItem 5 我必须调用什么才能调用 OnRender protected override void OnRe
  • ipywidgets:根据另一个小部件的结果更新一个小部件

    我在 IPython 中使用小部件 它允许用户重复搜索短语并在另一个小部件 选择小部件 中查看结果 不同的标题 然后选择其中一个结果 简而言之 search text widgets Text description Search sear
  • FOSUserBundle:删除 emailCanonical 的唯一索引

    我正在尝试删除 emailCanonical 上的唯一索引 以便多个用户可以共享相同的电子邮件地址 但是 我不想直接编辑 FOS UserBundle Resources config doctrine User orm xml 因为对包本
  • 在路径或正文中发布参数

    我正在创建 Rest API 但我对 URL 结构感到困惑 我只需在 Post 请求中向服务器发送一个参数 我应该通过路径变量还是在请求正文中发送它 最佳做法是什么 当前 URL 示例 api v1 users id name name n
  • Android BroadcastReceiver,设备重启后自动运行服务

    您好 我正在编写一个应用程序 当手机重新启动时 该服务将自动启动 而不是单击该应用程序 这是我的代码 BootCompleteReceiver java package com example newbootservice import a
  • Swift - 带图像的自定义 MKPointAnnotation

    我正在尝试创建一个自定义MKPointAnnotation在地图视图上使用 它看起来非常像苹果照片中使用的那个 我将从服务器检索一些照片及其位置 然后我想显示一个像上面这样的注释 并在注释中包含图像 我目前有一个程序可以添加正常的MKPoi
  • 在 .NET 中序列化数据传输对象

    我有一组数据传输对象 例如很多请求 响应消息类 如 MainRequest MainResponse ShutDown Request ShutDown Response 随着项目的发展 新的课程不断出现 这些类必须从和到进行 反 序列化具
  • Swift 2 中的本地化

    我想本地化我的应用程序 我正在使用 Swift 2 我遵循本教程但我遇到了两个问题 1 两种语言的本地化图像均消失 我以相同的方式本地化了多个图像German and English 对于两种语言 一组图像 图像的 en 和 de 版本 都
  • 什么时候2个虚拟地址可以映射到同一个物理地址?

    这里有一个操作系统 计算机体系结构问题 我正在阅读有关缓存的内容 了解如何虚拟索引缓存是减少地址转换时间的选项 我遇到了以下情况 Virtual cache difficulties include Aliasing Two differe
  • 从 .ui 文件生成 .h 和 .cpp

    假设我有文件about ui 我怎样才能使 关于 h 和 关于 cpp 从我的 ui文件 我必须创建一个 moc文件也 我怎么能够compile创建后看看是否一切都正确发生 如果自动生成不起作用 就像我的情况 您可以使用 uic 手动生成头
  • 如何命名 R 图中由垂直线分隔的 x 轴部分(包 ggplot2)?

    我创建了一个堆积面积图ggplot2并添加了垂直线在某些位置上x axis 我现在想命名sections由这些垂直线分隔开 它的一个示例可能看起来像示例图中所示 也欢迎其他解决方案 我有一个向量breaks x axis 以及间隔名称的向量