注意:在与Z. Lin讨论后,我发表了更新这篇文章。最初,我将我的问题简化为双因素设计(参见" 原始问题")。但是,我的实际数据包含四个因素,需要facet_grid。因此,我在下面提供了一个四因素设计的示例(参见" 编辑")。
原始问题
假设我有一个双因素设计,dv作为我的因变量,iv.x和iv.y作为我的因子/自变量。一些快速的样本数据:
ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_violin()
我的目标是分别显示每个条件,就像小提琴图一样可以很好地完成:
ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_sina()
我最近遇到了新浪的情节,并希望在这里做同样的事情。不幸的是,新浪阴谋不会这样做,而是会折叠数据。
ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_sina(position = position_dodge(width = 0.5))
对位置闪避的显式调用也没有帮助,因为这会产生错误信息:
DF <- data.frame(dv=rnorm(400),
iv.w=sort(rep(letters[1:2],200)),
iv.x=rep(sort(rep(letters[3:4],100)), 2),
iv.y=rep(sort(rep(rev(letters)[1:2],50)),4),
iv.z=rep(sort(rep(letters[5:6],25)),8))
2016年,新浪地块的作者已经意识到这个问题: https://github.com/thomasp85/ggforce/issues/47
我的问题更多的是时间。我们很快就想提交一份手稿,而新浪图则是展示我们数据的绝佳方式。任何人都可以想到新浪图的解决方法,这样我仍然可以显示两个因素,例如上面的小提琴情节?
修改
四因素设计的样本数据:
ggplot(DF, aes(iv.x, dv, colour=iv.y)) +
facet_grid(iv.w ~ iv.z) +
geom_violin(aes(y = dv, fill = iv.y),
position = position_dodge(width = 1))+
stat_summary(aes(y = dv, fill = iv.y), fun.y=mean, geom="point",
colour="black", show.legend = FALSE, size=.2,
position=position_dodge(width=1))+
stat_summary(aes(y = dv, fill = iv.y), fun.data=mean_cl_normal, geom="errorbar",
position=position_dodge(width=1), width=.2, show.legend = FALSE,
colour="black", size=.2)
使用新浪图绘制我想创建的小提琴图的示例:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
if(section==0){
static NSString *simpleTableIdentifier = @"ContactDetailsHeaderTableViewCell";
ContactDetailsHeaderTableViewCell *cell = (ContactDetailsHeaderTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ContactDetailsHeaderTableViewCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
..................
.................
UIImage *img = [UIImage imageWithContentsOfFile:getImagePath];
//rounded corners
cell.profilePicImgView.clipsToBounds = YES;
UIGraphicsBeginImageContextWithOptions(cell.profilePicImgView.bounds.size, NO, 1.0);
// Add a clip before drawing anything, in the shape of an rounded rect
[[UIBezierPath bezierPathWithRoundedRect:cell.profilePicImgView.bounds
cornerRadius:60.0] addClip];
// Draw your image
[img drawInRect:cell.profilePicImgView.bounds];
// Get the image, here setting the UIImageView image
cell.profilePicImgView.image = UIGraphicsGetImageFromCurrentImageContext();
// end drawing
UIGraphicsEndImageContext();
.............
.............
}
答案 0 :(得分:3)
已编辑的解决方案,因为OP澄清了需要的方面:
ggplot(DF, aes(x = interaction(iv.y, iv.x),
y = dv, fill = iv.y, colour = iv.y)) +
facet_grid(iv.w ~ iv.z) +
geom_sina() +
stat_summary(fun.y=mean, geom="point",
colour="black", show.legend = FALSE, size=.2,
position=position_dodge(width=1))+
stat_summary(fun.data=mean_cl_normal, geom="errorbar",
position=position_dodge(width=1), width=.2,
show.legend = FALSE,
colour="black", size=.2) +
scale_x_discrete(name = "iv.x",
labels = c("c", "", "d", "")) +
theme(panel.grid.major.x = element_blank(),
axis.text.x = element_text(hjust = -4),
axis.ticks.x = element_blank())
这种方法不是使用构面来模拟颜色之间的躲避,而是创建一个新的变量interaction(colour.variable, x.variable)
来映射到x轴。
scale_x_discrete()
&amp;中的其余代码theme()
用于隐藏默认的x轴标签/刻度/网格线。
axis.text.x = element_text(hjust = -4)
是一种将x轴标签移动到 大约 正确位置的黑客行为。这很丑陋,但考虑到用例是提交稿件,我认为图的大小是固定的,你只需要调整一次。
原始解决方案:
假设您的情节不需要刻面,您可以使用刻面模拟外观:
ggplot(DF, aes(x = iv.y, y = dv, colour = iv.y)) +
geom_sina() +
facet_grid(~iv.x, switch = "x") +
labs(x = "iv.x") +
theme(axis.text.x = element_blank(), # hide iv.y labels
axis.ticks.x = element_blank(), # hide iv.y ticks
strip.background = element_blank(), # make facet strip background transparent
panel.spacing.x = unit(0, "mm")) # remove horizontal space between facets