ggplot2将两个数据集合成一个图片

时间:2016-03-07 16:15:49

标签: r plot ggplot2 nlme

这必须是常见问题解答,但我无法在其他答案中找到完全相似的示例(如果您可以指出类似的Q& A,请随时关闭它)。我还是ggplot2的新手,似乎无法轻易地绕过它。

我有2个data.frames(来自不同的混合模型),我试图将它们绘制在同一个图表中。 data.frames是:

newdat
      id   Type         pred        SE
       1      1     15.11285 0.6966029
       2      1     13.68750 0.9756909
       3      1     13.87565 0.6140860
       4      1     14.61304 0.6187750
       5      1     16.33315 0.6140860
       6      1     16.19740 0.6140860
       1      2     14.88805 0.6966029
       2      2     13.46270 0.9756909
       3      2     13.65085 0.6140860
       4      2     14.38824 0.6187750
       5      2     16.10835 0.6140860
       6      2     15.97260 0.6140860

newdat2
      id                pred        SE
       1            14.98300 0.6960460
       2            13.25893 0.9872502
       3            13.67650 0.6150701
       4            14.39590 0.6178266
       5            16.37662 0.6171588
       6            16.08426 0.6152017

正如您所看到的,第二个data.frame没有Type,而第一个数据框没有id,因此每个ids都有2个值。

我可以用ggplot做什么,就是这样绘制一个:

fig1

http://i.imgur.com/br7yZYD.png

fig2

http://i.imgur.com/1ikMPy6.png

如您所见,在图1中,Typeids堆叠在x轴上,形成两组6 Type。但是,在图2中没有ids,而只有6 ids

我想要完成的是将fig2绘制到图1的左/右,并进行类似的分组。因此得到的情节看起来像图1,但有3组6 newdat

问题还在于,我需要标记和组织结果图,以便对于newdat2,x轴将包含&#34; model1&#34;的标签。对于Type&#34; model2&#34;的标签,或者来自不同模型的一些类似指标。更糟糕的是,我需要在newdat中为library(ggplot2) pd <- position_dodge(width=0.6) ggplot(newdat,aes(x=Type,y=newdat$pred,colour=id))+ geom_point(position=pd, size=5) geom_linerange(aes(ymin=newdat$pred-1.96*SE,ymax=newdat$pred+1.96*SE), position=pd, size=1.5, linetype=1) + theme_bw() + scale_colour_grey(start = 0, end = .8, name="id") + coord_cartesian(ylim=c(11, 18)) + scale_y_continuous(breaks=seq(10, 20, 1)) + scale_x_discrete(name="Type", limits=c("1","2")) 添加一些标签。

我(希望)可重复(但显然非常糟糕)的图1代码:

limits

图2的代码相同,但最后一行没有idggplot(aes())

为x轴定义了ggplot()

根据我的理解,在geom_point定义内容会使这些内容成为标准&#34;标准&#34;在整个图表中,我尝试删除常见内容,并为geom_linerangenewdat分别定义newdat2//NOTE: 'charsetName' has to be a valid Name (see 'Charset'-Class in the API) public String encode(char[] data, String charsetName) { //Convert char[] to a String String charString = String.copyValueOf(data); String encoded = ""; try { //Since there is no constructor which lets you set char[] with encoding //convert your String to a byte-Array. There is a constructor which lets //you set the Encoding for it. byte[] bytesEncoded = charString.getBytes(charsetName); //Construct a String using the encoding encoded = new String(bytesEncoded, charsetName); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return encoded; } ,但到目前为止还没有运气...我非常感谢任何帮助,因为我完全陷入困境。

1 个答案:

答案 0 :(得分:3)

如何添加首先向每个数据集添加一些新变量,然后将它们组合起来:

newdat$model <- "model1"

newdat2$model <- "model2"
newdat2$Type <- 3

df <- rbind(newdat, newdat2)
# head(df)

然后我们可以用:

绘图
library(ggplot2)

ggplot(df, aes(x = interaction(model, factor(Type)), y = pred, color = factor(id))) +
  geom_point(position = position_dodge(width = 0.6), size = 5) +
  geom_linerange(aes(ymin = pred - 1.96 * SE, ymax = pred + 1.96 * SE),
                 position = position_dodge(width = 0.6), 
                 size = 1.5, linetype = 1)

Plot 01

或者,您将额外的美学传递给geom_linerange以进一步描绘模型类型:

ggplot(df, aes(x = interaction(model, factor(Type)), y = pred, color = factor(id))) +
  geom_point(position = position_dodge(width = 0.6), size = 5) +
  geom_linerange(aes(ymin = pred - 1.96 * SE, ymax = pred + 1.96 * SE, linetype = model),
                 position = position_dodge(width = 0.6), 
                 size = 1.5)

Plot 02

最后,您可能需要考虑facets

ggplot(df, aes(x = interaction(model, factor(Type)), y = pred, color = factor(id))) +
  geom_point(position = position_dodge(width = 0.6), size = 5) +
  geom_linerange(aes(ymin = pred - 1.96 * SE, ymax = pred + 1.96 * SE),
                 position = position_dodge(width = 0.6), 
                 size = 1.5) +
  facet_wrap(~ id)

Plot 03 - Facets