作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
受Q Finding the elbow/knee in a curve的启发,我开始玩smooth.spline()
。
特别是,我想可视化参数df
(自由度)如何影响近似值以及一阶和二阶导数。请注意,此Q值不是近似值,而是ggplot2
可视化中的特定问题(或边缘情况)。
第一次尝试:简单的facet_grid()
library(ggplot2)
ggplot(ap, aes(x, y)) +
geom_point(data = dp, alpha = 0.2) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw()
dp
是一个data.table,包含要寻找其近似值的数据点,
ap
是一个data.table,其中包含近似数据和导数(数据在下面给出)。
facet_grid()
和
scales = "free_y"
已选择一个显示所有数据的标度。不幸的是,一个面板具有某种“离群值”,这使得很难在其他面板中看到细节。所以,我想“放大”。
coord_cartesian()
“放大”
ggplot(ap, aes(x, y)) +
geom_point(data = dp, alpha = 0.2) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw() +
coord_cartesian(ylim = c(-200, 50))
coord_cartesian()
分别应用于网格的每个单独面板(或一组面板,例如按行)的方法。例如,之后是否可以操作ggplot
对象?
cowplot
合并
cowplot
包将它们组合起来:
g0 <- ggplot(ap[deriv == 0], aes(x, y)) +
geom_point(data = dp, alpha = 0.2) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw()
g1 <- ggplot(ap[deriv == 1], aes(x, y)) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw() +
coord_cartesian(ylim = c(-50, 50))
g2 <- ggplot(ap[deriv == 2], aes(x, y)) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw() +
coord_cartesian(ylim = c(-200, 100))
cowplot::plot_grid(g0, g1, g2, ncol = 1, align = "v")
facet_wrap()
是否可以替代?
facet_wrap()
代替
facet_grid()
:
ggplot(ap, aes(x, y)) +
# geom_point(data = dp, alpha = 0.2) + # this line causes error message
geom_line() +
facet_wrap(~ deriv + df, scales = "free_y", labeller = label_both, nrow = 3) +
theme_bw()
coord_cartesian()
会影响所有面板。
geom_point(data = dp, alpha = 0.2)
Error in gList(list(x = 0.5, y = 0.5, width = 1, height = 1, just = "centre", : only 'grobs' allowed in "gList"
library(data.table)
# data points
dp <- data.table(
x = c(6.6260, 6.6234, 6.6206, 6.6008, 6.5568, 6.4953, 6.4441, 6.2186,
6.0942, 5.8833, 5.7020, 5.4361, 5.0501, 4.7440, 4.1598, 3.9318,
3.4479, 3.3462, 3.1080, 2.8468, 2.3365, 2.1574, 1.8990, 1.5644,
1.3072, 1.1579, 0.95783, 0.82376, 0.67734, 0.34578, 0.27116, 0.058285),
y = 1:32,
deriv = 0)
# approximated data points and derivatives
ap <- rbindlist(
lapply(seq(2, length(dp$x), length.out = 4),
function(df) {
rbindlist(
lapply(0:2,
function(deriv) {
result <- as.data.table(
predict(smooth.spline(dp$x, dp$y, df = df), deriv = deriv))
result[, c("df", "deriv") := list(df, deriv)]
})
)
})
)
最佳答案
答案很晚,但是以下hack只是发生在我身上。它适用于您的用例吗?
步骤1 。创建预期图的替代版本,限制y值的范围,以便scales = "free_y"
为每个构面行提供所需的比例范围。还要创建具有完整数据范围的预期构面图:
library(ggplot2)
library(dplyr)
# alternate plot version with truncated data range
p.alt <- ap %>%
group_by(deriv) %>%
mutate(upper = quantile(y, 0.75),
lower = quantile(y, 0.25),
IQR.multiplier = (upper - lower) * 10) %>%
ungroup() %>%
mutate(is.outlier = y < lower - IQR.multiplier | y > upper + IQR.multiplier) %>%
mutate(y = ifelse(is.outlier, NA, y)) %>%
ggplot(aes(x, y)) +
geom_point(data = dp, alpha = 0.2) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw()
# intended plot version with full data range
p <- p.alt %+% ap
ggplot_build()
生成两个ggplot对象的绘图数据。将alt版本的面板参数应用到预期版本:
p <- ggplot_build(p)
p.alt <- ggplot_build(p.alt)
p$layout$panel_params <- p.alt$layout$panel_params
rm(p.alt)
p <- ggplot_gtable(p)
grid::grid.draw(p)
关于r - 如何将单独的coord_cartesian()应用于 "zoom in"到facet_grid()的各个面板中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41536406/
我是一名优秀的程序员,十分优秀!