更改绘图区域背景颜色

4

我希望使用公司的颜色在R中制作一张图表。这意味着所有图表的背景都应该是浅蓝色,但绘图区域应该是白色的。我搜索了答案并发现绘制一个矩形可以实现这个目标(几乎)。然而,绘图区域现在是白色的,导致图表不可见。这是否可能?

getSymbols('SPY', from='1998-01-01', to='2011-07-31', adjust=T)

GRAPH_BLUE<-rgb(43/255, 71/255,153/255)
GRAPH_ORANGE<-rgb(243/255, 112/255, 33/255)
GRAPH_BACKGROUND<-rgb(180/255, 226/255, 244/255)

par(bg=GRAPH_BACKGROUND)

colorPlottingBackground<-function(PlottingBackgroundColor = "white"){
  rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col ="white")
}

plot.xts(SPY, col=GRAPH_BLUE)
colorPlottingBackground()
3个回答

14

我知道你已经接受了@plannapus的答案,但这是一个更简单的解决方案。

par(bg="lightblue")
plot(0, 0, type="n", ann=FALSE, axes=FALSE)
u <- par("usr") # The coordinates of the plot area
rect(u[1], u[3], u[2], u[4], col="white", border=NA)

par(new=TRUE)
plot(1:10, cumsum(rnorm(10)))

你需要做的基本上是使用 par(new=TRUE) 叠加两个图表:一个只有白色矩形;另一个则是包含实际要绘制内容的图表。

图片描述


啊,确实,我从来没有想过 par(new=TRUE) - plannapus
这是一个非常巧妙的东西 :) 当制作一些不寻常的图表时,我已经发现了各种用途。 - Backlin

4
问题在于您在绘制数据后才绘制白色矩形,从而覆盖了它们。由于plot.xts没有一个add参数,允许您在绘制矩形后调用它,我唯一看到的解决方案是修改plot.xts函数。
plot.xtsMODIFIED<-function (x, y = NULL, type = "l", auto.grid = TRUE, major.ticks = "auto", 
    minor.ticks = TRUE, major.format = TRUE, bar.col = "grey", 
    candle.col = "white", ann = TRUE, axes = TRUE, ...) 
{
    series.title <- deparse(substitute(x))
    ep <- axTicksByTime(x, major.ticks, format.labels = major.format)
    otype <- type
    if (is.OHLC(x) && type %in% c("candles", "bars")) {
        x <- x[, has.OHLC(x, TRUE)]
        xycoords <- list(x = .index(x), y = seq(min(x), max(x), 
            length.out = NROW(x)))
        type <- "n"
    }
    else {
        if (NCOL(x) > 1) 
            warning("only the univariate series will be plotted")
        if (is.null(y)) 
            xycoords <- xy.coords(.index(x), x[, 1])
    }
    ###The next three lines are the only modifications i made to the function####
    plot(xycoords$x, xycoords$y, type = "n", axes = FALSE, ann = FALSE) 
    rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col ="white")
    if(type=="l"){lines(xycoords$x, xycoords$y, ...)}

    if (auto.grid) {
        abline(v = xycoords$x[ep], col = "grey", lty = 4)
        grid(NA, NULL)
    }
    if (is.OHLC(x) && otype == "candles") 
        plot.ohlc.candles(x, bar.col = bar.col, candle.col = candle.col, 
            ...)
    dots <- list(...)
    if (axes) {
        if (minor.ticks) 
            axis(1, at = xycoords$x, labels = FALSE, col = "#BBBBBB", 
                ...)
        axis(1, at = xycoords$x[ep], labels = names(ep), las = 1, 
            lwd = 1, mgp = c(3, 2, 0), ...)
        axis(2, ...)
    }
    box()
    if (!"main" %in% names(dots)) 
        title(main = series.title)
    do.call("title", list(...))
    assign(".plot.xts", recordPlot(), .GlobalEnv)
}

然后你的脚本变成了:
library(quantmod)
getSymbols('SPY', from='1998-01-01', to='2011-07-31', adjust=T)

GRAPH_BLUE<-rgb(43/255, 71/255,153/255)
GRAPH_BACKGROUND<-rgb(180/255, 226/255, 244/255)

par(bg=GRAPH_BACKGROUND)

plot.xtsMODIFIED(SPY, col=GRAPH_BLUE)

输入图像描述

你遇到的错误信息 (Error in axis(1, at = xycoords$x, labels = FALSE, col = "#BBBBBB", ...) : formal argument "col" matched by multiple actual arguments.) 在之前的脚本中也出现过。这与 plot.xts 使用多个时间参数 ... 以及参数 col 同时适用于 axisplot(或在我修改后的版本中,lines)有关。如果您想避免这种情况,我看到两个解决方案: 要么您希望轴与线条颜色相同,因此您需要更改以下行:

...
axis(1, at = xycoords$x, labels = FALSE, col = "#BBBBBB", 
            ...)
...

介绍

...
axis(1, at = xycoords$x, labels = FALSE, ...)
...

如果你希望坐标轴具有原始 plot.xts 作者意图的颜色,那么你需要区分线条和坐标轴的颜色。

 plot.xtsMODIFIED<-function (x, y = NULL, type = "l", auto.grid = TRUE, major.ticks = "auto", 
                             minor.ticks = TRUE, major.format = TRUE, bar.col = "grey", 
                             candle.col = "white", ann = TRUE, axes = TRUE, 
                             lcol, ...) 
{
...
if(type=="l"){lines(xycoords$x, xycoords$y, lcol, ...)}
...
}

在实际调用时:

plot.xtsMODIFIED(SPY, lcol=GRAPH_BLUE)

哇,非常感谢。我没想到这么复杂,但是感谢你提供的代码! - MichiZH
还有一个问题。如果我使用plot.xtsMODIFIED(SPY, col=GRAPH_BLUE)绘制图形,就会出现错误:Error in axis(1, at = xycoords$x, labels = FALSE, col = "#BBBBBB", ...) : formal argument "col" matched by multiple actual arguments. 为什么会出现这个错误?我该如何避免它? - MichiZH

1

plot.xts将接受panel.first参数,这是在绘制线条之前绘制矩形的另一种方法。

library(quantmod)
getSymbols('SPY', from='1998-01-01', to='2011-07-31', adjust=T)

GRAPH_BLUE<-rgb(43/255, 71/255,153/255)
GRAPH_BACKGROUND<-rgb(180/255, 226/255, 244/255)
par(bg=GRAPH_BACKGROUND)
white.rect=function() do.call(rect,as.list(c(par()$usr[c(1,3,2,4)],col="white")))
plot.xts(SPY,panel.first=white.rect())

这并没有解决@plannapus指出的col=GRAPH_BLUE问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接