使用 dplyr 管道的 ggplot2 中的动态 ylim
Dynamic ylim in ggplot2 using dplyr pipe
我想在 ggplot 中创建动态 ylim 值,以便 ylim 参数引用 dplyr 通过管道提供的值。为了说明问题,请查看我想将其更改为(当前无法正常工作的)代码的工作(非通用)代码。
require(dplyr)
require(scales)
require(ggplot2)
x <- data.frame(name = c("A","B","C"),
value = c(2,4,6))
工作非通用代码:
arrange(x[1:2, ], value) %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
scale_y_continuous(labels=comma,
limits=c(0,max(arrange(x[1:2, ], value)$value) * 1.1))
通用代码不工作(调用未找到值):
arrange(x[1:2, ], value) %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
scale_y_continuous(labels=comma,
limits=c(0,max(value) * 1.1))
所以问题是是否有任何方法可以设置一般限制,即排列后的部分将始终相同(我需要生成很多相同的图表,但 x 不同,即不同的限制)。
谢谢!
如果您可以接受使用 <<-
并且不介意使用一个额外的变量,则以下内容将保留管道并为您提供一个动态的 ylim
:
max_val <- 0
arrange(x[1:2, ], value) %>%
{ max_val <<- max(.$value)
. } %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
scale_y_continuous(labels=comma,
limits=c(0, max_val * 1.1))
如果您调用 max(x$value[1,2])
,您可以避免让 ggplot 将 arg 解析为 max()
。
另外你的代码没有解释 comma
所以我把它排除在答案之外。
arrange(x[1:2, ], value) %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
scale_y_continuous(limits=c(0,max(x$value[1:2])) * 1.1)
您可以在您的极限值处绘制一个大小为零的虚拟点。这不是一个特别漂亮的解决方案,但它看起来确实相当灵活。代码看起来像
arrange(x[1:2, ], value) %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
geom_point(aes(x=c(name[1], name[1]), y = c(0, max(value)*1.1)), size=0) +
scale_y_continuous(labels=comma)
尝试了这两种解决方案
arrange(x[1:3, ], value) %>%
ggplot(data=.,
aes(x=factor(name),
y=value)) +
geom_bar(stat="identity") +
scale_y_continuous()
arrange(x[1:2, ], value) %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
geom_point(aes(x=c(name[1], name[1]), y = c(0, max(value)*1.1)), size=0) +
scale_y_continuous()
好像是自动调整的?
原文来自代码二
我想在 ggplot 中创建动态 ylim 值,以便 ylim 参数引用 dplyr 通过管道提供的值。为了说明问题,请查看我想将其更改为(当前无法正常工作的)代码的工作(非通用)代码。
require(dplyr)
require(scales)
require(ggplot2)
x <- data.frame(name = c("A","B","C"),
value = c(2,4,6))
工作非通用代码:
arrange(x[1:2, ], value) %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
scale_y_continuous(labels=comma,
limits=c(0,max(arrange(x[1:2, ], value)$value) * 1.1))
通用代码不工作(调用未找到值):
arrange(x[1:2, ], value) %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
scale_y_continuous(labels=comma,
limits=c(0,max(value) * 1.1))
所以问题是是否有任何方法可以设置一般限制,即排列后的部分将始终相同(我需要生成很多相同的图表,但 x 不同,即不同的限制)。 谢谢!
如果您可以接受使用 <<-
并且不介意使用一个额外的变量,则以下内容将保留管道并为您提供一个动态的 ylim
:
max_val <- 0
arrange(x[1:2, ], value) %>%
{ max_val <<- max(.$value)
. } %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
scale_y_continuous(labels=comma,
limits=c(0, max_val * 1.1))
如果您调用 max(x$value[1,2])
,您可以避免让 ggplot 将 arg 解析为 max()
。
另外你的代码没有解释 comma
所以我把它排除在答案之外。
arrange(x[1:2, ], value) %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
scale_y_continuous(limits=c(0,max(x$value[1:2])) * 1.1)
您可以在您的极限值处绘制一个大小为零的虚拟点。这不是一个特别漂亮的解决方案,但它看起来确实相当灵活。代码看起来像
arrange(x[1:2, ], value) %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
geom_point(aes(x=c(name[1], name[1]), y = c(0, max(value)*1.1)), size=0) +
scale_y_continuous(labels=comma)
尝试了这两种解决方案
arrange(x[1:3, ], value) %>%
ggplot(data=.,
aes(x=factor(name),
y=value)) +
geom_bar(stat="identity") +
scale_y_continuous()
arrange(x[1:2, ], value) %>%
ggplot(data=., aes(x=factor(name), y=value)) +
geom_bar(stat="identity") +
geom_point(aes(x=c(name[1], name[1]), y = c(0, max(value)*1.1)), size=0) +
scale_y_continuous()
好像是自动调整的?
原文来自代码二