微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

定义轴标签序列

如何解决定义轴标签序列

我想用规则的顺序标记某些刻度线,并在不带标签的情况下留下标记

我的数据(“coefs_PA”)是这样的

structure(list(year = c(1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019),estimate = c(0.111,0.081,-0.106,2.571,0.606,-0.234,0.325,0.891,0.062,0.37,-0.041,0.09,0.436,0.08,-0.973,0.147,-0.116,0.602,0.385,0.274,0.118,0.682),sd = c(0,0.488,0.411,1.282,0.473,0.447,0.427,0.52,0.477,0.394,0.384,0.379,0.404,0.416,0.43,0.419,0.464,0.788,0.456,0.451,0.467)),row.names = c(NA,-22L),class = "data.frame")

并使用以下代码

library(Hmisc)

plot(coefs_PA$year,coefs_PA$estimate,xaxt='n',yaxt="n",xlab=NA,ylab=NA,pch=17,ylim = c(min(coefs_PA$estimate - coefs_PA$sd),max((coefs_PA$estimate + coefs_PA$sd))))

with(data = coefs_PA,expr = errbar(year,estimate,estimate+sd,estimate-sd,add = TRUE,cap = 0))

axis(2,las=2,at = c(-1:4,1))
minor.tick(nx = 0,ny = 2,tick.ratio = 0.7)
axis(1,at=coefs_PA$fecha)
title(ylab=expression("Logit (P"[p]*")"),line=1.6,cex.lab=1)
mtext(side=3,line=0.2,"Year",font=2,cex=1.0)

我得到下图

enter image description here

我希望 x 轴的值为 2000、2005、2010、2015,其余的刻度线为空白。我试图用这个来获得它

axis(1,at = coefs_fechas_PA$fecha,labels = c(rep("",2),"2000",rep("",4),"2005","2010","2015",4))))

但是没有用。

欢迎任何提示

解决方法

设置

years <- do.call(seq,as.list(range(coefs_PA$year)))
years5 <- seq(2000,2020,by = 5)
# or,more dynamically
years5 <- years[ years %% 5 == 0 ]

plot(coefs_PA$year,coefs_PA$estimate,xaxt='n',yaxt="n",xlab=NA,ylab=NA,pch=17,ylim=c(min(coefs_PA$estimate - coefs_PA$sd),max((coefs_PA$estimate + coefs_PA$sd))))

axis(1,years,labels = ifelse(years %in% years5,years[NA]))

plot with axis labels/ticks

(然后是所有其他情节组件……为简洁起见省略。)

注意:如果我们改为执行 ifelse(..,""),则可能不会显示所需的年份,因为空字符串仍会导致潜在的重叠和/或标签问题。我们可以使用 ifelse(..,NA),这可能更直观,但从编程角度来说,我选择 years[NA] 有以下几个原因:

    ifelsedplyr::if_else 参数中的对象类不同时,
  • data.table::fifelse 替换(想到 yes=no=)通常会抱怨。您是否知道至少有六种类型的 NA,所有类别都不同?
  • 我可以硬编码 NA_integer_,因为 years 是一个整数向量,但我不想假设......也许你会用 numeric 代替(和因此应该使用NA_real_)。我想要与 NA 的类相同的 years 可能更具声明性,所以 years[NA] 给了我。 (也许我的编程强迫症正在显示。)
,

您可以通过使用 scale_x_date(breaks = my.data$date[seq(1,length(my.data$date),by = 5)]) 中的 ggplot 指定只显示每五个数据标签来实现这一点,正如 Eric Watt 在 How to show every second R ggplot2 x-axis label value?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?