【问题标题】:bar width in ggplot2 geom_barggplot2 geom_bar中的条形宽度
【发布时间】:2010-02-24 13:41:06
【问题描述】:

我正在尝试生成带有循环的图。

l1<-factor(rep(letters,4))
n1<-abs(rnorm(104))*10000
b1<-rep(c("1","2","3","4","5","6","7","8"),c(2,2,11,24,11,20,33,1))
k1<-rep((rep(c("A","B","C","D"),c(2,3,4,4))),8)
my.df<-data.frame(l1,b1,k1,n1)                            #make a dataframe

names(my.df)<-c("letter","branch","ltrtype","number")     #factor names
library(ggplot2)

branch.list<-unique(my.df$branch)
sayi<-length(branch.list)                                 # list of factor:letters

for (i in 1:sayi) {

branch.iter<-branch.list[i]
my.df.plot<-subset(my.df,my.df$branch==branch.iter,drop=T)

my.df.plot$branch<-factor(my.df.plot$branch)               #So that unused levels don't show up
my.df.plot$letter<-factor(my.df.plot$letter)               #So that unused levels don't show up
my.df.plot$ltrtype<-factor(my.df.plot$ltrtype)             #So that unused levels don't show up
my.df.plot$number<-as.numeric(as.character(my.df.plot$number))
my.df.plot<-data.frame(my.df.plot)

myfilename<-paste(branch.iter,".jpeg",sep="")
jpeg(file=myfilename)

cizim<-ggplot(my.df.plot,aes(letter,number,fill=ltrtype))
cizim<-cizim + geom_bar(width = 1, position = "fill", binwidth = 1) +     facet_grid(ltrtype~.)
cizim<-cizim + opts(title=branch.iter)

print(cizim)
dev.off()

}

(Q1):当 x 轴的层数改变时,条形的宽度改变 我怎样才能防止这种情况并使每个情节中的条形宽度相同?

alt text http://img411.imageshack.us/i/95325388.jpg/

alt text http://img411.imageshack.us/i/91510133.jpg/

(Q2):当i=7 R 给出以下警告时:

(data$ymin == 0)) 警告("ymin != 0 时填充定义不明确") : 需要 TRUE/FALSE 的缺失值

我该怎么办?

(Q3):在这种情况下,有没有更简单的方法可以删除未使用的级别,所以我不必使用

 my.df.plot$branch<-factor(my.df.plot$branch)

每次?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    你正在制作一些非常奇怪的情节。通过使用position="fill",您将每个条形拉伸到高度 1(因为对应于字母的一个观察值是面板中对应于字母的所有观察值的 100%),完全失去了您试图绘制的任何信息。我的猜测是你的一些问题源于这个错误,但我不确定。

    (Q1) 您是否希望不同分支的图中的条形宽度相同?由于您正在更改 x 变量的级别数,因此条形必须变宽才能填满图。一些解决方案:

    • 对绘图的宽度进行一些智能调整以绕过它。
    • 保留所有 x 级别 - 我认为这是最干净的方式
    • 您可以使用scale_x_discreteexpand 选项使条形变窄并居中。因此,如果您有 N 个总 x 值(此处 N=26 个字母),但特定图只使用其中的 k 个,则将 + scale_x_discrete(expand=c(0.05, (N-k)/2)) 添加到您的图。第一项是乘法扩展因子,这是默认值,第二项是加法因子。

    (Q2) i=7 是唯一有多个number 值对应于相同字母/ltrgroup 组合的组。 bar geom 不知道该怎么办。我同意错误信息真的很神秘。

    (Q3) 一种选择是避免使用因子 - 在组合字符向量时使用 data.frame(...,stringsAsFactors=FALSE),然后子集不会保留未使用的级别。

    【讨论】:

    • 是的。我想保持所有分支的条形宽度相同,因为有些分支有很多 x 值(有些只有一个),所以当我滚动图时,我会从一个大条变成许多小条。
    • 我仍然认为,如果您想比较地块,最好为所有地块保持相同的 x 水平,但我编辑了我的答案以包含使用 expand 的解决方案。
    【解决方案2】:

    (Q1) 我认为无法修复条形宽度。 Aniko 建议保留所有级别对我来说最有意义。

    (Q2)将binwidth = 1 替换为stat="identity",因为我认为您不需要stat="bin"

    (Q3)其他选项包括gdata-package 中的drop.levelsHmisc-package 中的dropUnusedLevels

    【讨论】:

      猜你喜欢
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多