使用一系列不一致的数据控制ggplot2图中的列宽

时间:2015-03-06 00:09:24

标签: r ggplot2 width bar-chart series

在我为MWE创建的人工数据中,我试图演示我在R中创建的脚本的本质。从这个代码中生成的图表可以看出,在我的一个条件下我没有“否”值来完成系列。

我被告知,除非我可以制作这最后一栏,遗憾的是没有额外的系列像其他列那么薄,在图中我不允许使用这些图。这是一个令人遗憾的问题,因为我编写的脚本同时生成了数百个图形,包括统计数据,显着性指标,传播误差条和智能y轴调整(这些功能当然不在MWE中)。

很少有其他评论:

  • 此例外栏不保证在图表的末尾...因此,手动调整以强制系列改变颜色并颠倒顺序,留下右侧的额外空间是不可靠的

  • 我试图将数据模拟为常数0,以便系列“存在”但不可见,但正如预期的那样,系列c的顺序(否,是)使得跳过一个空格这也是不可接受的。这就是在这里回答同样问题的方法,但遗憾的是,对我来说,我的限制不起作用:Consistent width for geom_bar in the event of missing dataInclude space for missing factor level used in fill aesthetics in geom_boxplot

  • 我也尝试用facet做这个,但是出现了很多问题,包括换行符,以及我添加到x轴的注释中的错误。

MWE:

library(ggplot2)

print("Program started")

x <- c("1","2","3","1","2","3","4")
s <- c("No","No","No","Yes","Yes","Yes","Yes")
y <- c(1,2,3,2,3,4,5)
df <- as.data.frame(cbind(x,s,y))

print(df)

gg <- ggplot(data = df, aes_string(x="x", y="y", weight="y", ymin=paste0("y"), ymax=paste0("y"), fill="s"));
dodge_str <- position_dodge(width = NULL, height = NULL);
gg <- gg + geom_bar(position=dodge_str, stat="identity", size=.3, colour = "black")

print(gg)

print("Program complete - a graph should be visible.")

2 个答案:

答案 0 :(得分:1)

是的,我想到了发生了什么:你需要特别注意因素和数字是数字的因素。在我的情况下,stringsAsFactors = FALSE我有

str(df)
'data.frame':   7 obs. of  3 variables:
 $ x: chr  "1" "2" "3" "1" ...
 $ s: chr  "No" "No" "No" "Yes" ...
 $ y: chr  "1" "2" "3" "2" ...

dput(df)
structure(list(x = c("1", "2", "3", "1", "2", "3", "4"), s = c("No", 
"No", "No", "Yes", "Yes", "Yes", "Yes"), y = c("1", "2", "3", 
"2", "3", "4", "5")), .Names = c("x", "s", "y"), row.names = c(NA, 
-7L), class = "data.frame")

没有因素和数字由于cbind - ing(sic!)变成了字符。让我们有另一个数据框:

dff <- data.frame(x = factor(df$x), s = factor(df$s), y = as.numeric(df$y))

添加&#34;虚拟&#34;行(对于您的示例,请手动检查链接问题中的expand.grid版本,了解如何自动执行此操作):

dff <- rbind(dff, c(4, "No", NA))

绘图(我删除了额外的aes):

ggplot(data = df3, aes(x, y, fill=s)) + 
  geom_bar(position=dodge_str, stat="identity", size=.3, colour="black")

enter image description here

答案 1 :(得分:1)

如下所示,以自己计算条形的x坐标为代价,您可以得到一张可能与您正在寻找的图表接近的图表。

x <- c("1","2","3","1","2","3","4")
s <- c("No","No","No","Yes","Yes","Yes","Yes")
y <- c(1,2,3,2,3,4,5)
df <- data.frame(cbind(x,s,y) )
df$x_pos[order(df$x, df$s)] <- 1:nrow(df)
x_stats <- as.data.frame.table(table(df$x), responseName="x_counts")
x_stats$center <- tapply(df$x_pos, df$x, mean)
df <-  merge(df, x_stats, by.x="x", by.y="Var1", all=TRUE)
bar_width <- .7
df$pos <- apply(df, 1, function(x) {xpos=as.numeric(x[4]) 
                                if(x[5] == 1) xpos 
                                else ifelse(x[2]=="No", xpos + .5 -        bar_width/2, xpos - .5 + bar_width/2) } )
 print(df)
gg <- ggplot(data=df, aes(x=pos, y=y, fill=s ) )
gg <- gg + geom_bar(position="identity", stat="identity", size=.3,    colour="black", width=bar_width)
gg <- gg + scale_x_continuous(breaks=df$center,labels=df$x )
plot(gg)

-----编辑----------------------------------------- ---------

修改后将标签放在条形的中心。

给出以下图表

enter image description here