gpt4 book ai didi

r - ggplot2:在不影响限制的情况下添加几何图形

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

我想向 ggplot 密度图添加额外的几何图形,但不更改数据的显示限制,也不必通过自定义代码计算所需的限制。举个例子:

set.seed(12345)
N = 1000
d = data.frame(measured = ifelse(rbernoulli(N, 0.5), rpois(N, 100), rpois(N,1)))
d$fit = dgeom(d$measured, 0.6)
ggplot(d, aes(x = measured)) + geom_density() + geom_line(aes(y = fit), color = "blue")

ggplot(d, aes(x = measured)) + geom_density() + geom_line(aes(y = fit), color = "blue") + coord_cartesian(ylim = c(0,0.025))

在第一个图中,拟合曲线(非常适合“测量”数据)掩盖了测量数据的形状:
Actual output
我想裁剪图以包含来自第一个几何图形的所有数据,但裁剪拟合曲线,如第二个图所示:
Desired output

虽然我可以用 coord_cartesian 生成第二个图,这有两个缺点:
  • 我必须通过我自己的代码来计算限制(这很麻烦且容易出错)
  • 通过我自己的代码计算限制与分面不兼容。不可能 (AFAIK) 使用 coord_cartesian 提供每个面的轴限制.然而,我需要将情节与 facet_wrap(scales = "free") 结合起来

  • 如果在计算坐标限制时不考虑第二个几何体,将实现所需的输出 - 是否可能 不计算自定义 R 代码中的限制 ?

    问题
    R: How do I use coord_cartesian on facet_grid with free-ranging axis是相关的,但没有令人满意的答案。

    最佳答案

    您可以尝试的一件事是缩放 fit并使用 geom_density(aes(y = ..scaled..)
    缩放 fit之间01 :

    d$fit_scaled <- (d$fit  - min(d$fit)) / (max(d$fit) - min(d$fit))

    使用 fit_scaled..scaled.. :
    ggplot(d, aes(x = measured)) + 
    geom_density(aes(y = ..scaled..)) +
    geom_line(aes(y = fit_scaled), color = "blue")

    output_1

    这可以与 facet_wrap() 结合使用:
    d$group <- rep(letters[1:2], 500) #fake group

    ggplot(d, aes(x = measured)) +
    geom_density(aes(y = ..scaled..)) +
    geom_line(aes(y = fit_scaled), color = "blue") +
    facet_wrap(~ group, scales = "free")

    ouput_2

    不缩放数据的选项:

    您可以使用功能 multiplot()来自 http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/
    multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
    library(grid)
    plots <- c(list(...), plotlist)

    numPlots = length(plots)

    if (is.null(layout)) {

    layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
    ncol = cols, nrow = ceiling(numPlots/cols))
    }

    if (numPlots==1) {
    print(plots[[1]])

    } else {

    grid.newpage()
    pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))

    for (i in 1:numPlots) {

    matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))

    print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
    layout.pos.col = matchidx$col))
    }
    }
    }

    使用此功能,您可以组合两个图,以便于阅读:
    multiplot(
    ggplot(d, aes(x = measured)) +
    geom_density() +
    facet_wrap(~ group, scales = "free"),
    ggplot(d, aes(x = measured)) +
    geom_line(aes(y = fit), color = "blue") +
    facet_wrap(~ group, scales = "free")
    )

    这会给你:

    output_3

    如果你想比较彼此相邻的组,你可以使用 facet_grid()而不是 facet_wrap()cols = 2multiplot() :
    multiplot(
    ggplot(d, aes(x = measured)) +
    geom_density() +
    facet_grid(group ~ ., scales = "free"),
    ggplot(d, aes(x = measured)) +
    geom_line(aes(y = fit), color = "blue") +
    facet_grid(group ~ ., scales = "free"),
    cols = 2
    )

    它看起来像这样:

    output_4

    关于r - ggplot2:在不影响限制的情况下添加几何图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46907589/

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