gpt4 book ai didi

r - 在多面 ggplot 中自动勾选最大值和最小值

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

我试图在多面 ggplot 中标记每个 x 轴的最大值和最小值。我有几个方面具有不同的 x 比例和相同的 y 比例,并且 x 轴刻度标签彼此重叠。与其手动确定每个方面 x 轴的限制和中断,我正在寻找一种方法来标记每个方面的最小值和最大值。

使用 CO2 的示例数据的代码数据集(见 ?CO2):

CO2$num <- 1:nrow(CO2)
library(reshape2)
CO2.melt <- melt(CO2,
id.var=c("Type",
"Plant",
"Treatment",
"num"))
CO2.melt <- CO2.melt[order(CO2.melt$num),]

library(ggplot2)
ggplot(CO2.melt,
aes(x = value,
y = num)) +
geom_path(aes(color = Treatment)) +
facet_wrap( ~ variable, scales = "free_x",nrow=1)

enter image description here

目的是复制测井显示,例如 this one .

最佳答案

当你想为刻度标签实现这个时,使用 scales = "free_x"在一个多面的情节中,这很难自动化。但是,通过一些修补和其他几个软件包的帮助,您还可以使用以下方法:

1) 总结数据以了解在 x 轴上需要哪些刻度标签/中断:

library(data.table)
minmax <- melt(setDT(CO2.melt)[, .(min.val = min(value), max.val = max(value),
floor.end = 10*ceiling(min(value)/10),
ceil.end = 10*floor((max(value)-1)/10)),
variable][],
measure.vars = patterns('.val','.end'),
variable.name = 'var',
value.name = c('minmax','ends'))

这使:
> minmax
variable var minmax ends
1: conc 1 95.0 100
2: uptake 1 7.7 10
3: conc 2 1000.0 990
4: uptake 2 45.5 40

2) 为每个方面创建中断向量:
brks1 <- c(95,250,500,750,1000)
brks2 <- c(7.7,10,20,30,40,45.5)

3) 创建构面:
p1 <- ggplot(CO2.melt[CO2.melt$variable=="conc",], 
aes(x = value, y = num, colour = Treatment)) +
geom_path() +
scale_x_continuous(breaks = brks1) +
theme_minimal(base_size = 14) +
theme(axis.text.x = element_text(colour = c('red','black')[c(1,2,2,2,1)],
face = c('bold','plain')[c(1,2,2,2,1)]),
axis.title = element_blank(),
panel.grid.major = element_line(colour = "grey60"),
panel.grid.minor = element_blank())

p2 <- ggplot(CO2.melt[CO2.melt$variable=="uptake",],
aes(x = value, y = num, colour = Treatment)) +
geom_path() +
scale_x_continuous(breaks = brks2) +
theme_minimal(base_size = 14) +
theme(axis.text.x = element_text(colour = c('red','black')[c(1,2,2,2,2,1)],
face = c('bold','plain')[c(1,2,2,2,2,1)]),
axis.title = element_blank(),
panel.grid.major = element_line(colour = "grey60"),
panel.grid.minor = element_blank())

4) 将图例提取到一个单独的对象中:
library(grid)
library(gtable)
fill.legend <- gtable_filter(ggplot_gtable(ggplot_build(p2)), "guide-box")
legGrob <- grobTree(fill.legend)

5) 创建最终图:
library(gridExtra)
grid.arrange(p1 + theme(legend.position="none"),
p2 + theme(legend.position="none"),
legGrob, ncol=3, widths = c(4,4,1))

这导致:

enter image description here

自动执行此操作的可能替代解决方案是使用 geom_textgeom_label .展示如何实现这一目标的示例:
# create a summary
library(dplyr)
library(tidyr)
minmax <- CO2.melt %>%
group_by(variable) %>%
summarise(minx = min(value), maxx = max(value)) %>%
gather(lbl, val, -1)

# create the plot
ggplot(CO2.melt, aes(x = value, y = num, color = Treatment)) +
geom_path() +
geom_text(data = minmax,
aes(x = val, y = -3, label = val),
colour = "red", fontface = "bold", size = 5) +
facet_wrap( ~ variable, scales = "free_x", nrow=1) +
theme_minimal()

这使:

enter image description here

您还可以在 ggplot 中即时获取最小值和最大值。 (归功于 @eipi10 )。另一个使用 geom_label 的例子:
ggplot(CO2.melt, aes(x = value, y = num, color = Treatment)) +
geom_path() +
geom_label(data = CO2.melt %>%
group_by(variable) %>%
summarise(minx = min(value), maxx = max(value)) %>%
gather(lbl, val, -1),
aes(x = val, y = -3, label = val),
colour = "red", fontface = "bold", size = 5) +
facet_wrap( ~ variable, scales = "free_x", nrow=1) +
theme_minimal()

这使:

enter image description here

关于r - 在多面 ggplot 中自动勾选最大值和最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35923155/

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