使用panel.superpose

时间:2015-11-24 05:20:00

标签: r histogram lattice

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))))

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

overlapping histograms showing cycling border colors

(它是将panel.superpose代码放在同一个面板上并分配颜色的enter code here #include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; class Matrix { public: vector<vector<int>> a; Matrix operator+ (const Matrix&); }; Matrix Matrix::operator+ (const Matrix& matrixprime) { Matrix matrix; int n = matrix.a.size(); int m = matrix.a[0].size(); for (int i=0; i<n; i++) { for (int j=0; j<m; j++) { matrix.a[i][j] = matrix.a[i][j] + matrixprime.a[i][j]; }; }; return matrix; }; int main () { int cases,k; cin >> cases; for(k=0;k<cases;k++) { Matrix x; Matrix y; Matrix result; int n,m,i,j; cin >> n >> m; for(i=0;i<n;i++) { vector<int> b; int num; for(j=0;j<m;j++) { cin >> num; b.push_back(num); } x.a.push_back(b); } for(i=0;i<n;i++) { vector<int> b; int num; for(j=0;j<m;j++) { cin >> num; b.push_back(num); } y.a.push_back(b); } result = x+y; for(i=0;i<n;i++) { for(j=0;j<m;j++) { cout << result.a[i][j] << " "; } cout << endl; } } return 0; } 代码。我对此并不了解。)

1 个答案:

答案 0 :(得分:2)

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") 
)

enter image description here