【问题标题】:Artificially adding ggplot squares into standard plot人为地将ggplot方块添加到标准图中
【发布时间】:2020-08-07 19:39:59
【问题描述】:

我对一件事有些怀疑。使用标准绘图可以人为地接近 ggplot 吗?例如,让我们看下面的两张图。第一个使用标准绘图创建,第二个使用 ggplot 创建。

x<-rnorm(100)
ggplot(data.frame(x),aes(x=1:100))+geom_line(aes(y=x))
as.ggplot(~plot(x,type='l'))

是否有可能将图像 (2) 中的正方形添加到图像 (1) 中?如何在不使用 ggplot 的情况下将第二张图的尽可能多的外观复制到第一张图?

提前感谢!

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您可以非常接近,问题是您为什么要这样做?无论如何,尝试这样的事情:

    x <- rnorm(100)
    
    # calculate the axis limits
    limitsX <- c(-1, length(x))
    limitsY <- range(x) * 1.1
    
    # get pretty ticks
    tickMarksX <- pretty(0:length(x))
    tickMarksY <- pretty(x)
    
    # plot
    plot(NULL, xlim=limitsX, ylim=limitsY, bty = 'n', xaxs = 'i', xaxt = 'n', yaxt = 'n', yaxs = 'i')
    rect(limitsX[1], limitsY[1], limitsX[2], limitsY[2], col = "#E0E0E0", border = NA)
    axis(1, at = tickMarksX, lwd = 0, ticks.lwd = 1)
    axis(2, at = tickMarksY, lwd = 0, ticks.lwd = 1)
    
    # major x grid lines
    abline(v = tickMarksX, col = "white", lwd=2)
    # minor x grid lines
    abline(v = tickMarksX-(tickMarksX[2]-tickMarksX[1])/2, col = "white")
    
    # major y grid lines
    abline(h = tickMarksY, col = "white")
    # minor y grid lines
    abline(h = tickMarksY-(tickMarksY[2]-tickMarksY[1])/2, col = "white")
    
    
    lines(x = 1:length(x), y = x)
    

    【讨论】:

    • 您是如何选择这些具体数字的?我的意思是,有没有可能让它更通用?
    • 当然,更多地使用max()min()range(),并通过相对大小增加坐标轴限制,例如max(x) * 1.25
    • 请问max(),min(),range(),max(x) *1.25 应该是什么时候? ;)) 我不确定我是否明白这一点。
    • 编辑了我的答案。我们手动计算 aaxis 限制,扩展它们并在此基础上添加网格线。
    【解决方案2】:

    这是我的尝试:

    ggplot:

    library(ggplot2)
    
    set.seed(69)
    df <- data.frame(x = 1:100, y = rnorm(100))
    
    ggplot(df, aes(x, y)) + geom_line()
    

    基础 R 图:

    par(mar = c(5, 5, 1, 1))
    plot(df$x, df$y, type = "l", xlab = "x", ylab = "y", xaxt = "n", yaxt = "n")
    axis(side = 1, at = 0:4 * 25, tcl = -0.25)
    axis(side = 2, las = 1, tcl = -0.25)
    rect(-5, -5, 110, 110, col = "#ebebeb")
    abline(v = 0:10 * 12.5, col = "white")
    abline(h = seq(-3, 3, 0.5), col = "white")
    lines(df$x, df$y)
    

    reprex package (v0.3.0) 于 2020 年 8 月 7 日创建

    【讨论】:

    • 您是如何选择这些具体数字的?我的意思是,有没有可能让它更通用?
    • @John 我查看了 ggplot 并复制了它。以编程方式复制 ggplot 的各个方面意味着重写 ggplot。我确信有一些捷径可以在某些情况下产生合理的结果,但也许如果你更清楚地了解你想要达到的目标会有所帮助吗?
    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多