R语言 通过使用不同的列值更改ggplot中的x轴标签值

llew8vvj  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(188)

我有下面的代码,其中我拟合了一个对数线性模型,并绘制了拟合图

r1 = lm(log10(df$size) ~ df$time + ...)
plt <- ggplot(data = df, aes(x=time, y=size))+
    geom_point(size = 0.1) +    # Scatter
    geom_line(aes(y = 10^predict(r1))) +
    scale_y_log10()

dataframe df包含3列,即datetimetimesizeTime是从datetime进行的规范化转换,这样r1可以采用浮点值而不是datetime。datetime以10分钟递增。
| 日期时间|时间|大小|
| --------------|--------------|--------------|
| 2022-07-01 00:00:00|0|四|
| 2019 -07- 12 00:00:10|六百|三十四|
| 2019 -07- 21 00:00:20|一千二|十二岁|

我现在要分阶段的问题是,我想用datetime值而不是time值替换x轴值。
我们可以使用scale_x_continuous(breaks = df$time, labels = df$datetime),但是,这将在每个点上放置x个标签。相反,我想以某种方式使用默认选择的轴标签(可能使用waiver()),然后从df$datetime中选择相同索引处的值。
我尝试使用Manual addition of x-axes in ggplot with new labels?,但对我来说不同的是,我有另一个列的日期时间,我想利用。

qlzsbp2j

qlzsbp2j1#

正如@Z.Lin已经提到的那样,用另一列的值替换break的标签通常可以很容易地实现,但只有在ggplot 2设置的每个默认break的数据中有相应的值时才有效,而通常情况下(请参阅您的示例数据)不是这样。
一个选项是使用插值来设置labels,例如使用Hmisc::approxExtrap

library(ggplot2)

r1 <- lm(log10(df$size) ~ df$time)
p <- ggplot(data = df, aes(x = time, y = size)) +
  geom_point(size = 0.1) + # Scatter
  geom_line(aes(y = 10^predict(r1))) +
  scale_y_log10() 

p +
  scale_x_continuous(
    labels = function(x) {
      x[!is.na(x)] <- Hmisc::approxExtrap(df$time, df$datetime, xout = x[!is.na(x)])$y
      as.POSIXct(x, origin = "1970-01-01")
    }
  ) +
  theme(plot.margin = margin(r = 50))

df <- data.frame(
  datetime = c(
    "2022-07-01 00:00:00",
    "2022-07-01 00:00:10", 
    "2022-07-01 00:00:20"
  ),
  time = c(0L, 600L, 1200L),
  size = c(4L, 34L, 12L)
)

df$datetime <- as.POSIXct(df$datetime)

db2dz4w8

db2dz4w82#

由于time是数字,waiver()选择的默认轴中断可能与df中的值不完全匹配。由于数据集中的datetime变量在每行中以固定的量递增,也许以下方法可以为您工作?

df.sliced <- df %>%
  slice(round(seq(1, n(),
                  length.out = 5)))

plt + scale_x_continuous(breaks = df.sliced$time, labels = df.sliced$datetime)

为了方便起见,我用5作为休息的次数;由GGPlot执行的确定中断数量的实际计算可能变得相当复杂。

相关问题