R 上 ggplot2 的样本大小的辅助 x 轴标签

2023-12-13

我正在尝试使用 R 中的 ggplot2 复制我在 Excel 中制作的以下图表:

Sample

我能够使用 geom_line() 成功创建线条,使用 geom_text() /一些手动调整创建标签,以及 y 轴。在下面找到我的代码:

library(readxl)
library(ggplot2)

somedata <- read_excel("somedata.xlsx")
somedata[,c(3:6)] <- somedata[,c(3:6)] * 100
somedata[,6] <- somedata[,6] + 25 

somegraph <- ggplot(data = somedata, aes(x = date))
somegraph + 
  geom_point(aes(y = eligible_main), shape = 15, size = 4) + 
  geom_line(aes(y = eligible_main)) + 
  geom_line(aes(y = eligible_center), size = 2) + 
  geom_line(aes(y = eligible_upper), linetype = 2) + 
  geom_line(aes(y = eligible_lower), linetype = 2) + 
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, 10), labels = paste0(seq(0, 100, 10), "%")) + 
  labs(title = "Title", x = "Time", y = "Percentage") + theme_classic() + 
  theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 90, hjust = 1))

作为参考,这里是我创建的一些假数据,其格式与我正在绘制的数据类似。您可以将其粘贴到 R 中并在控制台中运行上面的代码:http://s000.tinyupload.com/?file_id=43876540434394267818

但我发现很难在 x 轴上以相同方向创建样本大小的辅助标签。 ggplot2 或其他包是否有一个简单的解决方案?另外,我可以在图表上添加注释线以在完成后指出问题吗?

非常感谢!


我有一个可能有帮助的解决方案。我无法获取您共享的数据,我创建了自己的虚拟数据集,如下所示:

set.seed(12345)
library(lubridate)

df <- data.frame(
  dates=as.Date('2020-03-01')+days(0:9),
  y_vals=rnorm(10, 50,7),
  n=100
)

一、基本剧情:

library(scales)
library(ggrepel)    
p.basic <- ggplot(df, aes(dates, y_vals)) +
        geom_line() +
        geom_point(size=2.5, shape=15) +
        geom_text_repel(
            aes(label=paste0(round(y_vals, 1), '%')),
            size=3, direction='y', force=7) +
        ylim(0,100) +
        scale_x_date(breaks=date_breaks('day'), labels=date_format('%b %d')) +
        theme_bw()

enter image description here

请注意,我的代码与您的代码有点不同。文本标签通过ggrepel包裹。我还使用了一些函数scales修复和设置日期轴的格式(另请注意lubridate是用于在上面的虚拟数据集中创建日期的包)。否则,相当标准ggplot那里的东西。

对于轴外的文本,最好的方法是通过自定义注释,您必须在其中设置 grob。这里的做法如下:

  • “向下”移动轴以便为额外文本留出空间。我们通过在轴标题顶部设置边距来实现这一点。

  • 关闭剪辑通过coord_cartesian(clip='off')。这是为了通过允许在绘图区域之外绘制事物来查看绘图之外的注释所必需的。

  • 循环遍历以下值df$n,创建一个单独的annotation_custom通过以下方式将对象添加到绘图中for loop.

这是代码:

p <- p.basic +
    theme(axis.title.x = element_text(margin=margin(50,0,0,0))) +
    coord_cartesian(clip='off')

for (i in 1:length(df$n)) {
  p <- p + annotation_custom(
    textGrob(
      label=paste0('n=',df$n[i]), rot=90, gp=gpar(fontsize=9)),
      xmin=df$dates[i], xmax=df$dates[i], ymin=-25, ymax=-15
    )
}
p

enter image description here

高级选项带来更多乐趣

还有两件事需要添加:注释(例如特定点+文本的标注),以及轴标签内容之间的绘图下方的线条。

对于轴下方的线:你可以加breaks=通过相当容易地连接到其他轴scale_...breaks=范围;然而,对于日期轴来说,它......很复杂。这就是为什么我们将使用与上面相同的方法为轴下方的文本添加线条。这里的想法是将轴分解为sub.div下面代码中的段,它基于 x 轴上有多少个离散值。我可以内联执行几次......但首先创建变量很有趣:

sub.div <- 1/length(df$n)

然后,我使用它通过沿步骤单独注释线条来创建线条sub.div*i用一个for再次循环:

for (i in 1:(length(df$n)-1)) {
  p <- p + annotation_custom(
    linesGrob(
      x=unit(c(sub.div*i,sub.div*i), 'npc'),
      y=unit(c(0,-0.2), 'npc')   # length of the line below axis
    )
  )
}

enter image description here

我意识到这里的两端没有线条,但您可能会看到通过修改上面的方法来添加它是多么容易。

注释(带箭头,为什么不呢?):有很多方法可以进行注释。其中一些内容已涵盖在此处使用annotate()功能。以及这里。您可以使用annotate()如果你愿意的话,但在这个例子中,我将使用geom_label对于文本标签和geom_curve制作一些弯曲的箭头。

您可以手动传递个人aes()通过调用每个注释的两个函数来获取值。例如,geom_text(aes(x=as.Date('2020-03-01'), y=55,...,但是如果数据集中有一些注释,建议根据数据帧本身内的信息设置注释。我将首先在这里执行此操作,我们将标记其中两点:

df$notes <- c('','','','Wow!','','','OMG!!!','','','')

您可以使用以下值df$notes来指示哪些点被标记,并利用x and y同一数据集中的值。

然后,您只需将两个几何图形添加到您的绘图中,并根据您的需要进行修改以适应您自己的审美。

p <- p + geom_curve(
    data=df[which(df$notes!=''),],
    mapping=aes(x=dates+0.5, xend=dates, y=y_vals+20, yend=y_vals+2),
    color='red', curvature = 0.5,
    arrow=arrow(length=unit(5,'pt'))
  ) +
  geom_label(
    data=df[which(df$notes!=''),],
    aes(y=y_vals+20, label=notes),
    size=4, color='red', hjust=0
  )

enter image description here

最后一件事:水平线我之前在您的代码中注意到但忘记指出的最后一件事是,要制作水平线,只需使用geom_hline。这容易多了。另外,您可以通过两次调用来完成此操作geom_hline非常容易(如果您愿意将数据帧传递给函数,甚至只需一次调用):

p <- p + geom_hline(yintercept = 50, size=2, color='gray30') +
  geom_hline(yintercept = c(25,75), linetype=2, color='gray30')

请注意,建议添加这两个geom_hline calls before geom_line or geom_point在原来的p.basic阴谋所以他们落后于一切。

enter image description here

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

R 上 ggplot2 的样本大小的辅助 x 轴标签 的相关文章

  • 如何更改ggplot2中x轴和y轴的位置

    在我的真实研究世界中 在顶部 或顶部和底部 显示 x 轴 在右侧显示 y 轴是很常见的 然而 ggplot2 中的默认位置是 x 位于底部 y 位于左侧 下列的科斯克在这里发帖 https groups google com forum f
  • 在 R 中打印具有长字符串的数据帧

    让我们有一列包含长字符串的数据框 df lt data frame short rnorm 10 0 1 long replicate 10 paste rep sample letters runif 1 5 8 collapse 如何打
  • dplyr 将字符串拆分为逗号分隔的列表

    我正在尝试使用 dplyr 将字符串拆分为逗号分隔的字符串 但运气不佳 dat lt data frame key 1 4 labels c a ab abc b 我试图将标签列设置为 c a a b a b c b 我已经尝试了以下所有变
  • 使用 geom_tile() 的 R ggplot 热图:如何按年份排序并在 y 轴上显示所有年份?

    在研究了哈德利的书并在这里搜索后 我创建了一个由年和月矩阵组成的热图 颜色根据时间序列变量的百分比变化而变化 热图和我用来获取它的代码如下所示 我还有一些我自己无法解决的问题 1 如何对矩阵进行排序 排序 以便 y 轴中的年份从最早到最晚
  • 以给定的纵横比保存绘图

    我正在使用非常棒的库 ggplot2 我想出了如何使用设置绘图的纵横比coord fixed 现在 我想将绘图保存为具有指定宽度 例如 10 厘米 的 PDF 并计算所需的高度 我不知道如何实现这一目标 这可能吗 您可以使用网格函数来计算
  • R:如何应用输出多列数据帧的函数(使用 dplyr)?

    我想查找数据框中某一特定列与所有其他列之间的相关性 p 值和 95 CI broom 包提供了一个示例 说明如何使用带有 dplyr 和管道的 cor test 在两列之间执行此操作 对于 mtcars 和 mpg 列 我们可以与另一列进行
  • R:大向量的高效迭代子集和过滤

    我想更快地执行以下操作 Logic 我有一个向量big共 4 个元素1 2 3 4 我还有一个相同长度的阈值向量1 1 3 1 4 1 5 1 我希望每个元素找到第一个元素的索引next元素高于相应的阈值 在这种情况下 我的预期输出是 2
  • R - 在浏览器中获取帮助而不是内置的 R 帮助程序

    我见过 R help 的两种不同行为 当你输入 density例如 帮助已在您的默认浏览器中打开 帮助在内置 R 帮助程序中打开 R 中的窗口 我目前有第二种行为 但我想在浏览器中打开帮助 我可以轻松地在这两种行为之间切换吗 无需重新安装
  • 有没有办法在 RStudio 中调试 RScript 调用?

    假设我从命令行运行 R 脚本 如下所示 Rscript prog R x y z 我想检查某一行的代码 目前 我无法在 RStudio 中以交互方式调试它 因为我不知道如何传递参数 由于它设计为从命令行运行 因此如何通过命令行 RStudi
  • 从网络源获取 R 中的数据作为数据框

    我正在尝试使用 RCurl 包将一些空气污染背景数据作为 data frame 直接加载到 R 中 该网站有 3 个下拉框 用于在下载 csv 文件之前选择选项 如下图所示 我试图从下拉框中选择 3 个值 并使用 下载 CSV 按钮将数据作
  • JpGraph:使用 AccBarPlot 时如何控制 v3.5.0b1 中的 x/y 偏移、边距和颜色?

    一点背景 我正在尝试将使用 Symfony 1 2 构建的项目从一台服务器迁移到另一台服务器 该项目的功能之一是构建图表 最初使用 JpGraph 2 3 5 完成 如果不修改代码 该图表不会按预期显示 我正在寻找一些关于我可能忽略的内容的
  • dplyr 中的 Summarize 是否可以不删除数据框中的其他列?

    我有一个包含三列的数据框 我正在尝试进行简单的总结以查找数据框中每个城市的最高温度 但同时保留每个最高温度列出的日期 这是数据框 我们称之为 maxT new ID Date Max TemperatureF 1 TUS 1960 04 0
  • 使用底格里斯河从纬度/经度获取人口普查区

    我有相对较多的坐标 我想获取其人口普查区 除了 FIPS 代码 我知道我可以使用以下命令查找各个纬度 经度对call geolocator latlon 已完成here https stackoverflow com questions 5
  • R-了解 akima::interp 结果中的 NA 值

    我有以下数据框 ref dat k Intensity Slope 1 0 021467214 33 16 2 0 012444759 33 8 3 0 006079156 33 4 4 0 003792025 33 2 5 0 02276
  • 在函数内部调用 clusterApply 时,性能会下降

    我遇到了一个奇怪的问题clusterApply 我已经能够尽可能地隔离它 如下所示 首先 我从全局环境运行以下代码 require parallel cl lt makeCluster rep localhost 20 SOCK xl lt
  • 如何在 R 中为传单中的数值变量设置不对称颜色渐变

    我想让传单调色板以零为中心 红白绿发散 我已经尝试过中所说的这个帖子 https stackoverflow com questions 29262824 r center color palette on 0 当我尝试手动创建颜色时 我得
  • R:将 readRDS 应用于 .Rds 文件名的列表对象

    我有几个包含数据帧对象的 Rds 文件 我想对每个文件应用一个函数并将数据帧绑定到单个数据帧中 但是 当我尝试从文件名列表中读取多个 Rds 文件时 我收到错误 FUN X i 中的错误 从连接读取时出错 readRDS 不适用于列表吗 R
  • 在 R 中绘制对数正态概率密度

    我正在尝试在 R 中生成对数正态概率密度图 其中包含 3 个不同的均值对数和标准差对数 我尝试了以下方法 但我的图表太丑了 看起来一点也不好看 x lt seq 0 10 length 100 a lt dlnorm x meanlog 0
  • 从 R 环境中删除对象

    我正在阅读 Hadley 的 Advanced R 在第 8 章中 他说我们可以使用以下方法从环境中删除对象 rm 但是 移除该物体后我仍然可以看到该物体 这是我的代码 e lt new env e a lt 1 e b lt 2 e a
  • 根据另一列中的键累积一列中的值时出现问题

    我有一个看起来像这样的数据框 我需要使用 PROJ ID 列中的字符串创建一个新的值列 并形成 PROJ NAME 列中的值字符串 这里提供的解决方案 根据 r 中另一列的键累积一列中的值 https stackoverflow com q

随机推荐