0

更新

我按照@danlooo 的建议设法让 vline 显示出来,

geom_vline(aes(xintercept= 4.7) # 4.7 is the rough position of the first value in VLineValues <- c(25, 26, 27), between level 12 & 40 (also position 4 and 5)

但是,由于我的真实数据中有很多图,这些图是在具有 3 个不同 vlines 的循环中生成的,因此很难找到一个公式来为所有 vlines 获得正确的位置。

因此,我随后尝试使用sec.axis = sec_axis() . 不幸的是,您不能将连续轴添加到离散轴上,您将收到以下错误

错误:提供给连续刻度的离散值

然后我尝试用连续轴绘制数据并将分解后的数据添加为辅助轴。然而,这将图形“挤压”在一起,使其松散出特有的 S 形。

所以我最终放弃了用 ggplot 制作这些特定的图,而是使用了“正常”plot()功能,即使它看起来不像 ggplots 那样好,它也很有效......


我正在尝试使用 geom_vline 向具有分解 x 轴(必须分解)的 ggplot 添加一条垂直线。但是这条线没有出现。

我尝试了几种建议的解决方案:

用 x 轴上的日期定位 geom_vline

在离散 x 轴上绘制 geom_vline

课程日期 x 轴上的 ggplot geom_vline

https://www.py4u.net/discuss/866042(此解决方案适用于python ...)

https://github.com/tidyverse/ggplot2/issues/3197

https://github.com/tidyverse/ggplot2/issues/4285

https://community.rstudio.com/t/how-to-add-a-vertical-line-on-a-factor/38341

在 ggplot 中为 R 中的分类变量 x 轴绘制垂直线的问题

这是我当前代码的示例:

library(drc)
library(ggplot2)
library(data.table)
library(tidyverse)

con <-  c(0,1,4,12,40,100,300,1000, 0,1,4,12,40,100,300,1000,0,1,4,12,40,100,300,1000)
Vector <- c(1.2, 1.5, 1.8, 2, 2.7, 3, 3.5, 4,1.2, 1.5, 1.8, 2, 2.7, 3, 3.5, 4,1.2, 1.5, 1.8, 2, 2.7, 3, 3.5, 4)
df <- data.frame(Vector, con)

VLineValues <- c(25, 26, 27)

  dfTemp <- df[1:8,]
  dfTemp$X = con[1:8]
  dfTemp$X <- factor(dfTemp$X, levels=unique(dfTemp$X))
  
  print(ggplot(dfTemp, aes(x = X, y = Vector))+
        ylim(1, 4.5)+
        geom_point()+
        geom_vline(aes(xintercept= VLineValues[1] )+
        geom_smooth(method = drm, method.args = list(fct = LL.5()), se = FALSE))
       

我想要做的是遍历df,得到3个单独的图,每条线在x = 25,x = 26和x = 27处。

正如我上面提到的,我尝试了一些其他解决方案,您可以在其中获得关卡的位置,变异?tidyverse 等的数据。

如果 x 轴是数字或者我例如写,则 Vline 显示得很好

geom_vline(1:5) #Gives Vlines at the 5 first levels in the factorised x-axis

但是,它不会显示在分解的 x 轴上的水平之间

有关如何解决此问题的任何建议?

4

1 回答 1

2

因子只能由给定级别内的值组成:

> dfTemp$X
[1] 0    1    4    12   40   100  300  1000
Levels: 0 1 4 12 40 100 300 1000

您的 x 截距值 (25, 26, 27) 都不在水平范围内,因此无法绘制垂直线。

xintercept可以使用字符串或级别的位置来设置:

library(tidyverse)

data <-
  iris %>%
  mutate(Species = Species %>% as.factor())

data %>%
  ggplot(aes(Species, Sepal.Length)) +
    geom_point() +
    geom_vline(xintercept = 2) +
    geom_vline(xintercept = "setosa")

levels(data$Species)
于 2021-09-07T17:09:03.653 回答