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))))
请注意,您无法计算每个组中的条数,并在rep
设置中将这些数字提供给border
。如果两个直方图重叠,则至少有一个直方图将使用两种边框颜色。
(它是将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;
}
代码。我对此并不了解。)
答案 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")
)