使用 ggplot 包 R 更改图中 yaxis 面的标签

2024-04-21

这是我的数据集和生成绘图的代码。

library(reshape)
library(ggplot2)
set.seed(357)
myLetters <- function(length.out) {
a <- rep(letters, length.out = length.out)
grp <- cumsum(a == "a")
vapply(seq_along(a), 
     function(x) paste(rep(a[x], grp[x]), collapse = ""),
     character(1L))
}
name <- myLetters(90)
x <- data.frame(name = name, before = runif(90,min=-1, max=1),after =    runif(90,min=-0.2, max=0.2))
x <- x[order(x$before),]
xnew <- melt(x, id="name")
adata <- subset(xnew,xnew$variable=="after")
adata$name1 <- rep(1:90)
bdata <- subset(xnew,xnew$variable=="before")
bdata$name1 <- rep(1:90)
d <- rbind(bdata,adata)
d$name1 <- factor(d$name1,levels =c(1:90),labels = bdata$name)
colorname <- c("dark blue","dark red")
plot <- ggplot(data=d,aes(x=value,y=name1,group=variable,color=variable))+
    scale_fill_manual(values=colorname) +  
    scale_colour_manual(values=colorname) +  # I ADDED THIS LINE
    geom_point(size=1)+
    geom_path(aes(linetype = variable),size=0.3)+
    scale_linetype_manual(values=c("dashed", "solid"))+
    geom_vline(xintercept = c(-0.5,0,0.5),color="purple",size=0.5)+
   theme(panel.border = element_rect(colour = "black", fill=NA, size=0.5)
   )

plot

由于有 90 个标签,因此 y 轴刻度线标签彼此太接近。有没有办法定位 y 轴刻度线标签,以便第一个标签位于默认位置,第二个标签反映在 y 轴上,依此类推,对于所有 90 个标签?也许这有助于使情节更容易阅读。


我认为没有任何方法可以使用常规方法来做到这一点ggplot2命令。但可以使用编辑情节grid编辑功能。两种可能性:第一种使 y 轴标签交错,如图所示here https://stackoverflow.com/questions/36985825/stagger-axis-labels-new-feature-in-ggplot2/38024936#38024936;正如您所建议的,第二个是反映 y 轴上的每个第二个标签(和刻度线)。我让你来决定是否比原版更具可读性。

## Your data and code to generate the unedited plot

library(reshape)
library(ggplot2)
library(grid)
set.seed(357)
myLetters <- function(length.out) {
a <- rep(letters, length.out = length.out)
grp <- cumsum(a == "a")
vapply(seq_along(a), 
     function(x) paste(rep(a[x], grp[x]), collapse = ""),
     character(1L))
}
name <- myLetters(90)
x <- data.frame(name = name, before = runif(90,min=-1, max=1),after =    runif(90,min=-0.2, max=0.2))
x <- x[order(x$before),]
xnew <- melt(x, id="name")
adata <- subset(xnew,xnew$variable=="after")
adata$name1 <- rep(1:90)
bdata <- subset(xnew,xnew$variable=="before")
bdata$name1 <- rep(1:90)
d <- rbind(bdata,adata)
d$name1 <- factor(d$name1,levels =c(1:90),labels = bdata$name)
colorname <- c("dark blue","dark red")
plot <- ggplot(data=d,aes(x=value,y=name1,group=variable,color=variable))+
    scale_fill_manual(values=colorname) +  
    scale_colour_manual(values=colorname) +  # I ADDED THIS LINE
    geom_point(size=1)+
    geom_path(aes(linetype = variable),size=0.3)+
    scale_linetype_manual(values=c("dashed", "solid"))+
    geom_vline(xintercept = c(-0.5,0,0.5),color="purple",size=0.5)+
   theme(panel.border = element_rect(colour = "black", fill=NA, size=0.5)
   ) + theme_bw()

plot

第一种可能性

# Get the ggplot grob
g = ggplotGrob(plot)

# Make the relevant column a little wider
g$widths[3] = unit(1.5, "cm")

# Get a hierarchical list of component grobs
grid.ls(grid.force(g)) 

浏览列表以找到涉及左轴的部分。相关位是:

axis-l.6-3-6-3   
  axis.line.y..zeroGrob.1864   
  axis   
    axis.1-1-1-1   
      GRID.text.1861   
    axis.1-2-1-2

您需要设置路径(请参阅gPath in the editGrob()下面的函数)从“axis-l”,到“axis”,到“axis”,再到“GRID.text”。标签的 x 坐标当前为 1npc。我在这里所做的就是将每隔一个标签移动到 0npc。

# The edit 
g = editGrob(grid.force(g), 
      gPath("axis-l", "axis", "axis", "GRID.text"), 
      x = unit(c(1, 0), "npc"), 
      grep = TRUE)

# Draw the plot
grid.newpage()
grid.draw(g)

第二种可能- 需要更多的工作

# Get the ggplot grob
g = ggplotGrob(plot)

# Get a hierarchical list of component grobs.
# Need a path to the labels as before,
# and a path to the tick marks.
grid.ls(grid.force(g))

# Get info about the plot: tick mark length, right margin of the tick mark labels, and
# number of labels 
 plot_theme <- function(p) {
   plyr::defaults(p$theme, theme_get())
 }

tickMarkLength <- plot_theme(plot)$axis.ticks.length 
textRightMargin <- plot_theme(plot)$strip.text.y$margin[2]
numberOfLabels <-  length(unique(ggplot_build(plot)$data[[1]]$y))

## The edits:
# Edit the x positions of every second label
g = editGrob(grid.force(g), 
      gPath("axis-l", "axis", "axis", "GRID.text"), 
      x = unit.c(unit(1, "npc"), unit(1, "npc") + 2*tickMarkLength + textRightMargin - unit(1, "pt")),
      hjust = c(1, 0), 
      grep = TRUE)

# Edit the x coordinates of the tick marks
# Need to check for even or odd number of labels
xcoord = rep(unit.c(unit(1, "npc") - tickMarkLength, unit(1, "npc"),
              unit(1, "npc") + tickMarkLength, unit(1, "npc")), numberOfLabels/2)
if((numberOfLabels %% 2) == 0)   {
      xcoord = xcoord
   } else {
      xcoord = unit.c(xcoord, unit.c(unit(1, "npc") - tickMarkLength, unit(1, "npc")))
   }
g = editGrob(grid.force(g), 
      gPath("axis-l", "axis", "axis.1-2"), 
      x = xcoord, 
      grep = TRUE)


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

使用 ggplot 包 R 更改图中 yaxis 面的标签 的相关文章

随机推荐

  • 检测unicode字符串中的非ascii字符[重复]

    这个问题在这里已经有答案了 给定一个文本文件 或 unicode 字符串 检测 ASCII 编码之外的字符的好方法是什么 我可以轻松地将每个字符迭代传递给ord 但我想知道是否有更有效 更优雅或更惯用的方法来做到这一点 这里的最终目标是编译
  • Ruby/Rails 中的夏令时开始和结束日期

    我正在开发一个 Rails 应用程序 我需要在给定特定偏移量或时区的情况下查找夏令时开始和结束日期 我基本上将从用户浏览器接收到的时区偏移保存在数据库中 3 5 并且我想在由于夏令时而改变时对其进行修改 I know Time实例变量有ds
  • 获取 OS X 中用户库文件夹的路径

    我需要打开一个 NSSavePanel 并将用户库文件夹作为目标文件夹 通常我会通过输入来做到这一点 Library in NSSavePanel beginSheetForDirectory 只要应用程序没有被沙箱化 这种方法就可以正常工
  • Android Studio 1.0.2 m2respository gradle问题

    使用Android Studio 1 0 2 并且强制使用Gradle 2 2 1 所有系统变量都是正确的 在新的更新中 旧版本的 gradle 和 m2repository 存在问题 我正在尝试导入 kickflip io android
  • 如何手动调用(查找)ReCaptcha Callback函数?

    我目前正在尝试验证码解决 并决定使用流行的 2captcha 服务来实现此目的 他们的方法是向他们发送验证码值 谷歌验证码密钥和站点线程 然后他们解决它并向我发回应该发送给谷歌的完成值 以检查验证码是否已解决 我被困在最后一步 使用返回的解
  • 包装 API 以支持依赖注入

    我正在与一个只有静态函数的 API 进行交互 并且无法打开和更改 public class WindowsNativeGraphAPI public static IEnumerable
  • 练习:网络爬虫 - 并发不起作用

    我正在经历 golang 之旅 并致力于最后的练习 以将网络爬虫更改为并行爬行而不是重复爬行 http tour golang org 73 http tour golang org 73 我所改变的只是抓取功能 var used make
  • Android Resources$NotFoundException:无法找到资源 ID

    我从 Firebase 收到一份活动报告 由于找不到我的资源而导致活动失败 我真的很困惑为什么找不到它 因为我相信所有文件都在正确的目录中 并且用户使用的是 Android v8 1 它并不古老 应该能够处理我认为有的东西自 v1 1 以来
  • 强制用户注销会话 PHP

    我似乎无法找到这个问题的直接答案 有没有办法强制登录用户注销 我的登录系统本质上只依赖于包含用户唯一 ID 存储在 mysql 数据库中 的会话 所以本质上只是 if isset SESSION user id echo You re lo
  • Delphi XE2:为什么 FireMonkey 应用程序是高清的?

    根据 Delphi XE2 的发行说明 FireMonkey可以创建高清应用程序 HD 代表高清晰度 为什么是高清 VCL应用程序不能像FireMonkey一样创建高清应用程序吗 这里是Firemonkey 的文档 http docwiki
  • 来自 post 请求的有效负载在 Node.js 函数中不可用

    我刚刚开始摆弄三个新的 对我来说 框架 产品 MongoDB NodeJS 和 AngularJS 我想要完成的是让一个简单的表单提交一个值并将该值写入数据库 我已经到了这样的地步 在我的 Angular 应用程序中使用 http post
  • jQuery 中的对象或方法链接如何工作?

    我不是问链接的适当语法是什么 我知道它可能是这样的 myDiv removeClass off addClass on 据我所知 链接是相对于其他著名框架的优势之一 有人可以向我解释一下链接在这里是如何工作的吗 如果您有一个具有某些方法的对
  • 参数“sectionGroupName”无效

    我正在尝试添加服务引用 然后收到此错误 参数 sectionGroupName 无效 参数名称 sectionGrouName 项目运行 Net 3 5 当我将项目升级到 Net 4 0 时 它就可以工作了 但这对我来说不是一个选择 因为其
  • 为什么按钮不绘制?

    我不明白为什么按钮不绘制在它之前工作的背景上 这不会显示错误 这是代码 gt 这段代码是错误的吗 我的问题是否可以重现 它可能在按钮的代码中 我将不胜感激 import pygame pygame init screen pygame di
  • Kafka服务器未远程连接zookeeper服务器

    我正在尝试将 kafka 服务器 在 Windows 系统上 连接到 Zookeeper 服务器 我面临着 Opening socket connection to server 10 160 10 25 10 160 10 25 2181
  • Postmates 与 Shopify Shipping/Carrier 服务集成

    我们正在寻求集成此应用程序 https postmates com developer docs https postmates com developer docs进入我们的 Shopify 平台 有关其工作原理 请检查 http blo
  • 如何替换ng-view中的部分节?

    我倾向于 Angular 的路线 很清楚如何通过简单的设置将视图加载到 ng view 中template属性 假设我在视图上有一个小部件 当用户导航到 changeWidget 时 如何仅替换小部件内容 在我看来 我只能使用单个ng vi
  • android:errorMessageBackground 在 styles.xml 中找不到资源错误

    我正在研究EditText验证并使用 setError 显示错误消息 我的主要座右铭是根据我的应用程序设计更改错误弹出窗口 我用的是 android errorMessageBackground 风格但不幸的是我得到了 No Resourc
  • 将非标准 svn 转换为 git

    我们有一个非标准的 svn 设置 如下所示 Root gt Trunk gt Projects gt Project 1 gt Project 2 gt Project 3 gt Libraries gt Library 1 gt Libr
  • 使用 ggplot 包 R 更改图中 yaxis 面的标签

    这是我的数据集和生成绘图的代码 library reshape library ggplot2 set seed 357 myLetters lt function length out a lt rep letters length ou