gpt4 book ai didi

R - ggplot2 'dodge' geom_step() 重叠 geom_bar()

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

使用 ggplot2 的 geom_bar(stat="identity") 绘制计数是一种有效的计数可视化方法。我想使用这种方法来显示我观察到的计数并将它们与预期计数进行比较我想通过使用 geom_step 来做到这一点在条形图上覆盖阶梯图图层。

但是,当我这样做时,我遇到了默认情况下条形图的位置被躲避的问题,但 geom_step才不是。例如同时使用连续和离散因变量:

library(tidyverse)

test <- data_frame(a = 1:10, b = runif(10, 1, 10))

test_plot <- ggplot(test, aes(a, b)) +
geom_bar(stat="identity") +
geom_step(color = 'red')

test2 <- data_frame(a = letters[1:10], b = runif(10, 1, 10))

test2_plot <- ggplot(test2, aes(a, b, group = 1)) +
geom_bar(stat="identity") +
geom_step(color = 'red'))

gridExtra::grid.arrange(test_plot, test2_plot, ncol = 2)

enter image description here

正如您所看到的,这两层是偏移的,这是不可取的。

阅读文档我看到 geom_path有一个 position =选项但是尝试类似 geom_step(color = 'red', position = position_dodge(width = 0.5))不做我想要的,而是将酒吧和楼梯线向中心压缩。另一种选择是像这样直接调整数据 geom_step(aes(a-0.5, b), color = 'red')这对具有连续因变量的数据产生了接近可接受的结果。您还可以将阶梯线计算为函数并使用 stat_function() 绘制它。 .

enter image description here

但是,这些方法不适用于具有离散因变量的数据,并且我的实际数据具有离散因变量,因此我需要另一个答案。

此外,当移动时,阶梯线不会覆盖上图所示的最后一个栏。有没有一种简单优雅的方法来扩展它以覆盖最后一个酒吧?

geom_step()是错误的方法,我想要得到的东西可以通过另一种方式实现,我对此也很感兴趣。

最佳答案

我认为解决这个问题最有效的方法是通过以下方式定义自定义几何体:

library(tidyverse)

geom_step_extend <- function(data, extend = 1, nudge = -0.5,
...) {
# Function for computing the last segment data
get_step_extend_data <- function(data, extend = 1, nudge = -0.5) {
data_out <- as.data.frame(data[order(data[[1]]), ])
n <- nrow(data)
max_x_y <- data_out[n, 2]
if (is.numeric(data_out[[1]])) {
max_x <- data_out[n, 1] + nudge
} else {
max_x <- n + nudge
}

data.frame(x = max_x,
y = max_x_y,
xend = max_x + extend,
yend = max_x_y)
}

# The resulting geom
list(
geom_step(position = position_nudge(x = nudge), ...),
geom_segment(
data = get_step_extend_data(data, extend = extend, nudge = nudge),
mapping = aes(x = x, y = y,
xend = xend, yend = yend),
...
)
)
}

set.seed(111)
test <- data_frame(a = 1:10, b = runif(10, 1, 10))
test2 <- data_frame(a = letters[1:10], b = runif(10, 1, 10))

test_plot <- ggplot(test, aes(a, b, group = 1)) +
geom_bar(stat = "identity") +
geom_step_extend(data = test, colour = "red")

test2_plot <- ggplot(test2, aes(a, b, group = 1)) +
geom_bar(stat = "identity") +
geom_step_extend(data = test2, colour = "red")

gridExtra::grid.arrange(test_plot, test2_plot, ncol = 2)

Example_output

基本上这个解决方案由三部分组成:
  • 使用 position_nudge 向左轻推期望值的步长曲线(在本例中为 -0.5);
  • 使用函数 get_step_extend_data 计算缺失的(右侧的)段数据.它的行为灵感来自 ggplot2:::stairstep这是geom_step的底层函数;
  • 撰写 geom_stepgeom_segmentlist 在单独的 geom 中.
  • 关于R - ggplot2 'dodge' geom_step() 重叠 geom_bar(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43434725/

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