在 panel.superpose 的直方图中显示具有不同边框的组

Display groups with different borders in histogram with panel.superpose

This answer 展示了如何使用 groupspanel.superpose 在同一面板中显示重叠的直方图,为每个直方图分配不同的颜色。另外,我想给每个直方图一个不同的边框颜色。 (这将允许我将一个直方图显示为无边框的实心条,并覆盖透明的全边框直方图。为清楚起见,下面的示例略有不同。)

虽然可以使用 border= 在绘图中使用不同的边框颜色,但它们不会分配给组,因为填充颜色是 col=。如果你给 border= 一个颜色序列,它似乎一次循环一个条。如果两个直方图重叠,效果就有点傻了(见下文)。

有没有办法给每个组一个特定的边框颜色?

# This illustrates the problem: Assignment of border colors to bars ignores grouping:

# make some data
foo.df <- data.frame(x=c(rnorm(10),rnorm(10)+2), cat=c(rep("A", 10),rep("B", 10)))

# plot it
histogram(~ x, groups=cat, data=foo.df, ylim=c(0,75), breaks=seq(-3, 5, 0.5), lwd=2,
          panel=function(...)panel.superpose(..., panel.groups=panel.histogram, 
                                             col=c("transparent", "cyan"), 
                                             border=c(rep("black", 3), rep("red", 3))))

请注意,您不能只计算每组中有多少条柱,然后将这些数字提供给 border 设置中的 rep。如果两个直方图重叠,则至少有一个直方图将使用两种边框颜色。

(就是panel.superpose把组放在同一个面板上,分配颜色的代码,我理解的不是很深。)

panel.histogram() 没有正式的 groups= 参数,如果你检查它的代码,你会发现它以不同的方式处理任何提供的 groups= 参数比 panel.*() 函数做的标准方式。该设计决策的结果是(如您所见)通常不容易将指定每组外观的图形参数向量传递给它

作为解决方法,我建议使用 latticeExtra+()as.layer() 函数来覆盖多个单独的 histogram()地块,每组一个。以下是您可以这样做的方法:

library(lattice)
library(latticeExtra)

## Split your data by group into separate data.frames
foo.df <- data.frame(x=c(rnorm(10),rnorm(10)+2), cat=c(rep("A", 10),rep("B", 10)))
foo.A <- subset(foo.df, cat=="A")
foo.B <- subset(foo.df, cat=="B")

## Use calls to `+ as.layer()` to layer each group's histogram onto previous ones  
histogram(~ x, data=foo.A, ylim=c(0,75), breaks=seq(-3, 5, 0.5), 
          lwd=2, col="transparent", border="black") +
as.layer(
histogram(~ x, data=foo.B, ylim=c(0,75), breaks=seq(-3, 5, 0.5), 
          lwd=2, col="cyan", border="red") 
)