我想在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左对齐特定的标签与最长的标签的图和
- 把这些用斜体写出来?
非常感谢您的帮助-如果只有其中一个问题得到解决。
2条答案
按热度按时间sdnqo3pr1#
您不想使用小平面图的原因是什么?它为您进行切片,同时不需要设置手动参数,除了您想要分离的组:
输出:
i2loujxw2#
省略刻度线标记并使节为斜体可以通过向
theme
元素的参数传递向量来轻松实现。但要注意,这有点笨拙,并且不受官方支持,因此您将收到警告。将节文本与最长的标签对齐是另一回事。至少我还没有找到一个完美的解决方案,最好的我可以来已经需要切换到ggtext::element_markdown
,但仍然需要手动设置水平对齐,例如,对于您的示例数据,设置部分文本的hjust=1.5
似乎工作正常: