向脊线图添加具有密度的 y 轴
Add a y-axis with density to ridgeline plot
我很难在描述密度的脊线图中添加 y 轴。如果我没看错,脊线图是一种密度图。我用它代替箱线图,还包括分位数线。我喜欢它现在的样子,但是我的主管没有看到与箱线图相比的好处,并且一直希望我包括一个带有密度的 y 轴。是否可以添加它,或者我是否必须使用密度图,我是否有可能将它们安排得像
geom_density_ridges
做?
这是我的一个情节:
这是一个可重现的例子:
ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +
geom_density_ridges(scale = 0.9) +
theme_ridges() +
theme(legend.position = "none")
非常感谢!
一个选择是让你通过 facet_grid
或 _wrap
加上一些额外的样式,比如去掉条形文本和面板之间的间距:
library(ggplot2)
library(ggridges)
ggplot(diamonds, aes(x = price, fill = cut)) +
geom_density() +
scale_y_continuous(expand = expansion(mult = c(0, .2))) +
facet_grid(cut~., switch = "y") +
xlim(-1000, NA) +
theme_ridges() +
theme(legend.position = "none",
strip.text.x = element_blank(),
strip.text.y.left = element_text(angle = 0, vjust = 0.01),
strip.background.y = element_rect(fill = NA),
strip.placement = "outside",
panel.grid.major.y = element_blank(),
panel.spacing.y = unit(0, "pt"))
我只是想继续说这是一个糟糕而棘手的解决方案,但我已经花时间了所以为什么不 post 呢?谁知道;这样的黑客可能对其他人来说很方便。
计划是:我们将半手动地复制 ggridges 所做的事情,但是在普通的 ggplot2 中并且是连续的。为此,我们将滥用 after_stat()
函数来 (1) 用密度填充色带,以及 (2) 为我们自己超级分配最大密度,我们将其用作偏移量。
library(ggplot2)
g <- ggplot(diamonds, aes(x = price, fill = cut)) +
stat_density(
geom = "ribbon", position = "identity",
aes(ymax = after_stat(density + (group - 1) * max(density)),
ymin = after_stat((group - 1) * {yoffset <<- max(density)}))
)
整个计划的缺陷是我们事先不知道偏移量,因此我们需要至少构建一次地块才能实际使用它。
build <- ggplot_build(g)
最后,我们将非常手动地在尺度上分配正确的值。我们将为离散标签使用主要标签,为连续标签使用次要标签。您可以查看现在应该在您的全局环境中的 yoffset
值,以了解正确的中断和标签是什么。
g + scale_y_continuous(
breaks = yoffset * (4:0), labels = levels(diamonds$cut),
sec.axis = dup_axis(
breaks = rep(yoffset * (0:4), 4) + rep(seq(0, 0.0003, by = 0.0001), each = 5),
labels = rep(seq(0, 0.0003, by = 0.0001), each = 5)
)
)
由 reprex package (v1.0.0)
于 2021-07-15 创建
设置breaks/labels的一种更通用的方法:
levels <- levels(diamonds$cut)
labels <- scales::extended_breaks(3)(c(0, yoffset * 0.8))
offsets <- yoffset * (seq(length(levels), 1) - 1)
g + scale_y_continuous(
breaks = offsets, labels = levels,
sec.axis = dup_axis(
breaks = rep(offsets, length(labels)) + rep(labels, each = length(offsets)),
labels = rep(labels, each = length(offsets))
)
)
我很难在描述密度的脊线图中添加 y 轴。如果我没看错,脊线图是一种密度图。我用它代替箱线图,还包括分位数线。我喜欢它现在的样子,但是我的主管没有看到与箱线图相比的好处,并且一直希望我包括一个带有密度的 y 轴。是否可以添加它,或者我是否必须使用密度图,我是否有可能将它们安排得像
geom_density_ridges
做?
这是我的一个情节:
ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +
geom_density_ridges(scale = 0.9) +
theme_ridges() +
theme(legend.position = "none")
非常感谢!
一个选择是让你通过 facet_grid
或 _wrap
加上一些额外的样式,比如去掉条形文本和面板之间的间距:
library(ggplot2)
library(ggridges)
ggplot(diamonds, aes(x = price, fill = cut)) +
geom_density() +
scale_y_continuous(expand = expansion(mult = c(0, .2))) +
facet_grid(cut~., switch = "y") +
xlim(-1000, NA) +
theme_ridges() +
theme(legend.position = "none",
strip.text.x = element_blank(),
strip.text.y.left = element_text(angle = 0, vjust = 0.01),
strip.background.y = element_rect(fill = NA),
strip.placement = "outside",
panel.grid.major.y = element_blank(),
panel.spacing.y = unit(0, "pt"))
我只是想继续说这是一个糟糕而棘手的解决方案,但我已经花时间了所以为什么不 post 呢?谁知道;这样的黑客可能对其他人来说很方便。
计划是:我们将半手动地复制 ggridges 所做的事情,但是在普通的 ggplot2 中并且是连续的。为此,我们将滥用 after_stat()
函数来 (1) 用密度填充色带,以及 (2) 为我们自己超级分配最大密度,我们将其用作偏移量。
library(ggplot2)
g <- ggplot(diamonds, aes(x = price, fill = cut)) +
stat_density(
geom = "ribbon", position = "identity",
aes(ymax = after_stat(density + (group - 1) * max(density)),
ymin = after_stat((group - 1) * {yoffset <<- max(density)}))
)
整个计划的缺陷是我们事先不知道偏移量,因此我们需要至少构建一次地块才能实际使用它。
build <- ggplot_build(g)
最后,我们将非常手动地在尺度上分配正确的值。我们将为离散标签使用主要标签,为连续标签使用次要标签。您可以查看现在应该在您的全局环境中的 yoffset
值,以了解正确的中断和标签是什么。
g + scale_y_continuous(
breaks = yoffset * (4:0), labels = levels(diamonds$cut),
sec.axis = dup_axis(
breaks = rep(yoffset * (0:4), 4) + rep(seq(0, 0.0003, by = 0.0001), each = 5),
labels = rep(seq(0, 0.0003, by = 0.0001), each = 5)
)
)
由 reprex package (v1.0.0)
于 2021-07-15 创建设置breaks/labels的一种更通用的方法:
levels <- levels(diamonds$cut)
labels <- scales::extended_breaks(3)(c(0, yoffset * 0.8))
offsets <- yoffset * (seq(length(levels), 1) - 1)
g + scale_y_continuous(
breaks = offsets, labels = levels,
sec.axis = dup_axis(
breaks = rep(offsets, length(labels)) + rep(labels, each = length(offsets)),
labels = rep(labels, each = length(offsets))
)
)