gpt4 book ai didi

r - 是否有一种编程方式可以在 ggplot2 图上传递 y 轴的特定范围?

转载 作者:行者123 更新时间:2023-12-04 07:54:32 25 4
gpt4 key购买 nike

我有根据一些用户输入自动生成的图。大多数情况下,这些情节工作正常。然而,一些用户要求确保在绘制数据的每一端总是有一个轴标签。例如,这个情节:

sample_data <-
data.frame(
x = rep(LETTERS[1:3], each = 3)
, y = 1:9 + 0.5
)


ggplot(
sample_data
, aes(x = x, y = y)) +
stat_summary(
fun = "mean"
)
enter image description here
在顶点上方或底点下方没有标签。我可以很容易地添加它们 expand_limits :
ggplot(
sample_data
, aes(x = x, y = y)) +
stat_summary(
fun = "mean"
) +
expand_limits(y = c(2, 10))
enter image description here
但是,因为这些图是自动生成的,所以我不能每次都手动添加下一个轴点。我试过通过 only.loose = TRUElabeling:extended ,但这仍然不会改变显示的值(不仅仅是输入我想要的值):
ggplot(
sample_data
, aes(x = x, y = y)) +
stat_summary(
fun = "mean"
) +
scale_y_continuous(breaks = breaks_extended(only.loose = TRUE))
enter image description here
此外,一些图比这更复杂(例如,有或没有置信区间、附加分组等),并且使用 dplyr 为该图准备数据。并直接通过管道输入 ggplot (与 %>% )。因此,即使是像重新计算值这样的事情也不是微不足道的。
事实上,即使在这种情况下,它也会失败,因为添加扩展点以捕获下一组标签会更改标签。
ggplot(
sample_data
, aes(x = x, y = y)) +
stat_summary(
fun = "mean"
) +
scale_y_continuous(breaks = breaks_extended(n = 5
, only.loose = TRUE)) +
expand_limits(y =
sample_data %>%
group_by(x) %>%
summarise(my_mean = mean(y)) %>%
pull(my_mean) %>%
range() %>%
{labeling::extended(.[1], .[2], 5
, only.loose = TRUE)}
)
enter image description here
发生这种情况似乎是因为
labeling::extended(2.5, 8.5, 5, only.loose = TRUE)
用 1 返回 2 到 9 的范围,而:
labeling::extended(2, 9, 5, only.loose = TRUE)
以 2 为单位返回 2 到 10 的范围。不知何故, breaks_extended正在加入一些额外的变化,尽管我是否追踪它并没有太大变化。我可以通过首先计算休息时间来解决这个问题,但是(再次)这是一组相当复杂的图。
我觉得我错过了一些明显的点,但它一直在躲避我。

最佳答案

是的,有一种编程方式来设置 y 尺度的限制,即为 limits 提供一个函数。争论。将自然数据限制作为输入,然后您可以以编程方式对其进行编辑。休息也是如此,除了输入是限制。
下面的示例,此代码的确切外观取决于您的规范。

library(ggplot2)

sample_data <- data.frame(
x = rep(LETTERS[1:3], each = 3),
y = 1:9 + 0.5
)


ggplot(sample_data,
aes(x = x, y = y)) +
stat_summary(
fun = "mean"
) +
scale_y_continuous(
limits = function(x) {
lower <- floor(x[1])
lower <- ifelse(x[1] - lower < 0.5, lower - 1, lower)
upper <- ceiling(x[2])
upper <- ifelse(upper - x[2] <= 0.5, upper + 1, upper)
c(lower, upper)
},
breaks = function(x) {
scales::breaks_pretty()(x)
}
)
#> Warning: Removed 3 rows containing missing values (geom_segment).

创建于 2021-03-23 由 reprex package (v1.0.0)

关于r - 是否有一种编程方式可以在 ggplot2 图上传递 y 轴的特定范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66770484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com