在 panel.superpose 的直方图中显示具有不同边框的组
Display groups with different borders in histogram with panel.superpose
This answer 展示了如何使用 groups
和 panel.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")
)
This answer 展示了如何使用 groups
和 panel.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")
)