【问题标题】:Define sequence of axis labels定义轴标签的顺序
【发布时间】:2021-10-06 03:12:27
【问题描述】:

我想用常规序列标记某些刻度线,并在它们之间留下没有标签的标记。

我的数据(“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.427, 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)

我得到下图

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

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

但它没有用。

任何提示都会受到欢迎。

【问题讨论】:

  • axis(1, seq(2000,2020,5)) 能解决您的问题吗?
  • @its_deb,问题是我的学习时间是1998:2019,需要blank, blank, 2000, blank, blank, blank, blank, 2005,...等等
  • @JuanCarlos,你需要每年的刻度,但只在特定年份标注?
  • @r2evans,你是对的。每年一个刻度,但仅限于 2000、2005、2010 和 2015 年的标签。

标签: r plot axis-labels


【解决方案1】:

设置

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, years[NA]))

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

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

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

【讨论】:

  • ¡¡Muchas gracias!!。非常感谢!!。不仅是为了好的解决方案,也是为了您的解释。这是我第一次听说不同类型的“NA”。你每天都会学到一些新东西:)我确信我会使用“ifelse(....,years, NA)”而不是你的方法。
【解决方案2】:

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

【讨论】:

  • 问题是使用基本图形,而您的答案是使用ggplot2,不兼容。虽然考虑到后者,该建议是有效的,但它在这里没有用,除非/直到 OP 选择切换绘图引擎。
猜你喜欢
  • 1970-01-01
  • 2019-04-03
  • 2012-04-28
  • 2015-10-04
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
相关资源
最近更新 更多