【问题标题】:ggplot is not graphing a vertical lineggplot 没有绘制垂直线
【发布时间】:2020-07-20 20:44:11
【问题描述】:

我正在尝试在 ggplot2 中绘制图表,其中 x 轴代表月-日组合,点代表两个不同组的 y 值。

使用此代码绘制我的原始数据集时,

ggplot(graphing.df, aes(MONTHDAY, y.var, color = GROUP)) +
          geom_point() + 
          ylab(paste0(""))+ 
          scale_x_discrete(breaks = function(x) x[seq(1, length(x), by = 15)])+ 
        theme(legend.text = element_blank(),
              legend.title = element_blank()) + 
          geom_vline(xintercept = which(graphing.df$MONTHDAY == "12-27")[1], col='red', lwd=2)

我得到了这张图中没有显示垂直线的地方。

当我尝试使用以下代码创建可重现的示例时...

df <- data.frame(MONTHDAY = c("01-01", "01-01", "01-02", "01-02", "01-03", "01-03"),
                                TYPE = rep(c("A", "B"), 3),
                                VALUE = sample(1:10, 6, replace = TRUE))
      
      verticle_line <- "01-02"
      
      ggplot(df, aes(MONTHDAY, VALUE, color = TYPE)) +
          geom_point() + 
          #geom_vline(xintercept = which(df$MONTHDAY == verticle_line)[1], col='red', lwd=2)+ 
          geom_vline(xintercept = which(df$MONTHDAY == verticle_line), col='blue', lwd=2)

竖线显示,但现在显示在错误的位置

在我的原始数据集中,每个月-日组合有两个值(代表两组中的每一个)。月日组合列是字符向量,不是因子,也没有层次。

【问题讨论】:

  • 查看which(df$MONTHDAY == verticle_line) 返回的内容。垂直线绘制在那里...
  • 我收到以下错误Error in UseMethod("rescale") : no applicable method for 'rescale' applied to an object of class "factor"

标签: r ggplot2


【解决方案1】:

这是一种方法。它对数据进行子集化,仅保留感兴趣的行并绘制由MONTHDAY 定义的垂直线。

library(ggplot2)

verticle_line <- "01-02"

ggplot(df, aes(MONTHDAY, VALUE, color = TYPE)) +
  geom_point() + 
  geom_vline(data = subset(df, MONTHDAY == verticle_line),
             mapping = aes(xintercept = MONTHDAY), color = 'blue', size = 2)

数据

我将重新发布数据创建代码,这次设置 RNG 种子以使示例可重现。

set.seed(2020)
df <- data.frame(MONTHDAY = c("01-01", "01-01", "01-02", "01-02", "01-03", "01-03"),
                                TYPE = rep(c("A", "B"), 3),
                                VALUE = sample(1:10, 6, replace = TRUE))
      

【讨论】:

  • 当我尝试运行此代码时出现以下错误Error in UseMethod("rescale") : no applicable method for 'rescale' applied to an object of class "factor"
  • @user8304241 你的 R 版本是多少?在 R 4.0.0 中,data.frame() 的默认值更改为 stringsAsFactors = FALSE。在问题中,您说 x 轴是 字符向量的离散轴。查看MONTHDAY的类。
【解决方案2】:

您的行没有显示在您期望的位置的原因是因为您正在通过which() 函数的输出设置xintercept= 的值。 which() 返回条件为真的索引值。因此,对于您的可重现示例,您会得到以下结果:

> which(df$MONTHDAY == verticle_line)
[1] 3 4

它返回一个向量,表明在df$MONTHDAY 中,该向量中的索引 3 和 4 为真。所以你的代码如下:

geom_vline(xintercept = which(df$MONTHDAY == verticle_line)...

简化为:

geom_vline(xintercept = c(3,4)...

您的 MONTHDAY 轴未格式化为日期,而是被视为字符向量的离散轴。在这种情况下,xintercept=c(3,4) 应用于离散轴在 x 截距处绘制两条垂直线,相当于该轴上的第 3 个和第 4 个离散位置:换句话说,“01-03”和......一些未知的第 4 个位置不是在轴范围内可观察到。

你如何解决这个问题?拿出which()

ggplot(df, aes(MONTHDAY, VALUE, color = TYPE)) +
  geom_point() + 
  geom_vline(xintercept = verticle_line, col='blue', lwd=2)

【讨论】:

    【解决方案3】:

    子集后我们可以得到'MONTHDAY'的对应值

    ggplot(df, aes(MONTHDAY, VALUE, color = TYPE)) +
          geom_point() + 
          geom_vline(xintercept = df$MONTHDAY[df$MONTHDAY == verticle_line],
                            col='blue', lwd=2)
    

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 2012-04-04
      • 2019-05-05
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      相关资源
      最近更新 更多