R语言 在ggplot2中使用离散刻度的自定义轴刻度线和标签

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

我想在R中绘制一个图,显示一组变量的平均值和置信区间。变量应在图中分为两部分。
以下是一些示例数据:

set.seed (110)
mean_vals <- runif (10, min = 7, max = 15)
lower_conf <- mean_vals - runif (10, min = 0.5, max = 3)
upper_conf <- mean_vals + runif (10, min = 0.5, max = 3)
var_names <- factor (c (paste0("variable", LETTERS[1:9]), "longVariableJ"),
                     levels = c ("longVariableJ", paste0("variable", LETTERS[9:1]) )
                     )

plot_data <- data.frame (variable = var_names, mean = mean_vals, lower = lower_conf, upper = upper_conf)

如果没有部分,情节将是这样的:

library(ggplot2)
ggplot (data = plot_data, 
        mapping = aes(x = mean, xmin = lower, xmax = upper, 
                      y = variable)
                                  ) + 
    geom_errorbarh (height = 0.1) +
    geom_point (shape = 21) +
    labs (x = "Estimate", y = "") +
    theme_bw()

它看起来像这样:

到目前为止,我的方法还没有成功。我尝试了以下方法:

library(tidyverse)
plot_data_extended <- plot_data %>% 
    add_row (.before = 5, variable = "section2") %>%
    add_row (.before = 5, variable = "") %>%
    add_row (.before = 1, variable = "section1")

plot_data_extended$variable <- factor (plot_data_extended$variable,
                                       levels = rev (plot_data_extended$variable))

ggplot (data = plot_data_extended, 
        mapping = aes(x = mean, xmin = lower, xmax = upper, 
                      y = variable)
                                  ) + 
    geom_errorbarh (height = 0.1) +
    geom_point (shape = 21) +
    labs (x = "Estimate", y = "") +
    theme_bw()

这给了我这个情节:

这是正确的方向,但是:

  • 我想省略那些不包含绘制点和晶须数据的行的刻度线-即“部分”行和空行。
  • 我希望“* section 1 ”和“ section 2 *”为 * 斜体 *,
  • 我希望“* section 1 ”和“ section 2 *”与最长的变量名左对齐(这里是“longVariableJ”)。

我不知道是否有比在我的plot_data数据框中添加行更好的方法。如果没有更优雅的方法,我会很难定制刻度线和刻度标签。我尝试进一步编辑数据框,添加例如一列指示是否绘制刻度线(相应地,左对齐刻度标签),但我没有成功。我没有找到类似于这个虚构函数的函数:if (plot_data_extended$omit_tickmark == 1) {omit_tickmark (), leftaline_ticklabel (), italic_ticklabel ()}或类似。因此:

  • 我怎样才能告诉R省略特定的刻度线
  • 我怎么能告诉R左对齐特定的标签与最长的标签的图和
  • 把这些用斜体写出来?

非常感谢您的帮助-如果只有其中一个问题得到解决。

sdnqo3pr

sdnqo3pr1#

您不想使用小平面图的原因是什么?它为您进行切片,同时不需要设置手动参数,除了您想要分离的组:

plot_data <- mutate(plot_data, section = c(rep("section1", 4), rep("section2", 6)))

ggplot (data = plot_data, 
        mapping = aes(x = mean, xmin = lower, xmax = upper, 
                      y = variable)) + 
  facet_wrap(~factor(section), ncol=1, scales="free_y") +
  geom_errorbarh (height = 0.1) +
  geom_point (shape = 21) +
  labs (x = "Estimate", y = "") +
  theme_bw()

输出:

i2loujxw

i2loujxw2#

省略刻度线标记并使节为斜体可以通过向theme元素的参数传递向量来轻松实现。但要注意,这有点笨拙,并且不受官方支持,因此您将收到警告。将节文本与最长的标签对齐是另一回事。至少我还没有找到一个完美的解决方案,最好的我可以来已经需要切换到ggtext::element_markdown,但仍然需要手动设置水平对齐,例如,对于您的示例数据,设置部分文本的hjust=1.5似乎工作正常:

library(ggplot2)

ggplot(
  data = plot_data_extended,
  mapping = aes(
    x = mean, xmin = lower, xmax = upper,
    y = variable
  )
) +
  geom_errorbarh(height = 0.1) +
  geom_point(shape = 21) +
  labs(x = "Estimate", y = "") +
  theme_bw() +
  theme(
    axis.ticks.y = element_line(
      linewidth = .5 * rev(c(0, rep(1, 4), 0, 0, rep(1, 6)))
    ),
    axis.text.y = ggtext::element_markdown(
      face = rev(c("bold.italic", rep("plain", 4), "plain", "bold.italic", rep("plain", 6))),
      hjust = rev(c(1.5, rep(1, 4), 1, 1.5, rep(1, 6)))
    )
  )

相关问题