ggplot2没有使用整个绘图区域

时间:2016-02-22 22:32:28

标签: r ggplot2

我正在尝试使用以下代码创建以下图表:

x = sample(0:1,10,replace = TRUE)
y = sample(0:1,10,replace = TRUE)
df = data.frame(x,y)
dfSummary<-ddply(df, "x", summarise, sdbar = sd(y), ybar = mean(y))
ggplot(dfSummary, aes(x,y = ybar))+
    geom_bar(stat="identity",fill="dark blue")+
    geom_errorbar(ymin=(pmax(0,dfSummary$ybar-dfSummary$sdbar)),ymax=(pmin(dfSummary$ybar+dfSummary$sdbar,1)))+
    scale_y_continuous(limits = c(0, 1),breaks=seq(0,1,.1)) + 
    theme(panel.grid = element_blank()) + 
    theme(panel.background =element_blank())+
    scale_x_discrete( breaks= c(0,1), limits = c(0,1),labels= c("x = 0", "x = 1")) +
    ylab("Proportion of objective responders")

您在下面看到的结果图像显示了一个图,其中x = 0和x = 1的两个条占据了y轴长度的一半(在左侧),但没有填写整个绘图区域。

我非常感谢您如何在图像宽度上显示条形图。

enter image description here

我通过将x更改为一个因子来尝试@heroka建议的内容。现在代码看起来像这样:

x = sample(0:1,10,replace = TRUE)
y = sample(0:1,10,replace = TRUE)
df = data.frame(x,y)
df$x = as.factor(df$x)
dfSummary<-ddply(df, "x", summarise, sdbar = sd(y), ybar = mean(y))
ggplot(dfSummary, aes(x,y = ybar))+
  geom_bar(stat="identity",fill="dark blue")+
  geom_errorbar(ymin=(pmax(0,dfSummary$ybar-dfSummary$sdbar)),ymax=(pmin(dfSummary$ybar+dfSummary$sdbar,1)))+
  scale_y_continuous(limits = c(0, 1),breaks=seq(0,1,.1)) + 
  theme(panel.grid = element_blank()) +
  theme(panel.background =element_blank())+
  scale_x_discrete( breaks= c(0,1), limits = c(0,1),labels= c("x = 0", "x = 1")) +
  ylab("Proportion of objective responders")

我得到图像Box plot with incorrect labels,你可以看到标签“x = 0”和“x = 1”现在不在正确的位置。 “x = 1”位于错误的条形下,“x = 0”甚至不出现。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

正如Heroka所提到的,将x变量作为一个因素。 您的比例问题是因为在scale_x_discrete中您指定了数字中断&amp;您不再需要的限制(如果as.numeric您的x因素,您将获得1和2,而不是0和1,这就是为什么1标签与x = 0对齐的原因)。

p <- ggplot(dfSummary, aes(x,y = ybar))+
  geom_bar(stat="identity",fill="dark blue")+
  geom_errorbar(ymin=(pmax(0,dfSummary$ybar-dfSummary$sdbar)),ymax=(pmin(dfSummary$ybar+dfSummary$sdbar,1)))+
  scale_y_continuous(limits = c(0, 1),breaks=seq(0,1,.1)) + 
  theme(panel.grid = element_blank()) +
  theme(panel.background =element_blank())+
  ylab("Proportion of objective responders")

你可以:

  1. 省略'break'和'limits'参数

    p + scale_x_discrete(labels=c("x=0", "x=1"))
    
  2. 由于x是一个因素,只需将值设为标签'x = 0'和'x = 1'而不是'0'和'1'

    dfSummary$x <- factor(c('x=0', 'x=1'))
    # just use the code for `p` above to make your graph, no scale_x_discrete
    #  needed.