在R中创建分组条形图

时间:2014-01-08 01:16:01

标签: r plot bar-chart

我在R中有一个数据框df,如下所示:

        D     C     B     E     K     R
Rd      80    80    80    80    80    80
Sw      100   100   100   100   100   100
Sf      100   100   100   100   100   100

我正在尝试在条形图中绘制数据。我需要y轴的范围是0-100,x轴是类别名称。基本上,我需要它看起来像这样:

100 |               _ _ _ _ _ _    _ _ _ _ _ _
    |_ _ _ _ _ _   | | | | | | |  | | | | | | |
    | | | | | | |  | | | | | | |  | | | | | | |
    | | | | | | |  | | | | | | |  | | | | | | |
    | | | | | | |  | | | | | | |  | | | | | | |
 0  |_|_|_|_|_|_|__|_|_|_|_|_|_|__|_|_|_|_|_|_|_
     D C B E K R    D C B E K R    D C B E K R
         Rd             Sw            Sf

所有Ds颜色相同,所有Cs颜色相同,依此类推。

我不知道该怎么做,或者使用哪些库。

到目前为止,我有:

counts <- as.matrix(df$D, df$C, df$B, df$E, df$K, df$R)

barplot(counts, beside = TRUE, space = c(0, 0, 0, 0, 0, 0), xlab = "",
col = c("coral", "coral1", "coral2", "coral3", "coral4", "cornflowerblue"),
    names.arg = c("D", "C", "B", "E", "K", "R"))
mtext(side = 1, text = "x label", line = 7)

但它只显示如下内容:

100 |  _ _   _ _
    |_| | |_| | |
    | | | | | | |
    | | | | | | |
    | | | | | | |
 0  |_|_|_|_|_|_|_
     D C B E K R
       x label

我不知道为什么我只得到这个。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

试试这个:

df2 <- t(as.matrix(df))
bp <- barplot(df2,beside=TRUE,col=1:6)
mtext(rownames(df2),1,at=bp)

enter image description here

如果您想编辑旋转轴标签的内容或准确定位组/条标签,那么您可以执行类似下面的代码。更改line=参数以影响标签的垂直位置,并在las=1调用上更改barplot参数,以根据需要旋转标签。

df2 <- t(as.matrix(df))
bp <- barplot(df2,beside=TRUE,col=1:6,axisnames=FALSE,las=1)
mtext(rownames(df2),1,at=bp,line=0.6)
mtext(colnames(df2),1,at=colMeans(bp),line=2)

答案 1 :(得分:4)

set.seed(1)
df <- data.frame(groups = rep(c("Rd", "Sw", "Sf"), each=6),
                 bars = rep(c("D", "C", "B", "E", "K", "R"), 3),
                 values = sample(1:100,18))
library(ggplot2)
ggplot(df, aes(x=bars, y=values, fill=bars)) + 
  geom_bar(stat="identity", position="dodge") + 
  facet_wrap(~groups, ncol=3)

结果:见下图。

或者,如果您从问题中获取数据框:

df <- read.table(sep=" ", header=T, text="
D C B E K R
Rd 80 80 80 80 80 80
Sw 100 100 100 100 100 100
Sf 100 100 100 100 100 100")

df$facet <- row.names(df)
library(reshape2)
df.long <- melt(df, "facet")
ggplot(df.long, aes(x=variable, y=value, fill=variable)) + 
  geom_bar(stat="identity", position="dodge") + 
  facet_wrap(~facet, ncol=3)

enter image description here

答案 2 :(得分:0)

看起来你不希望as.matrix调用data.frame中的列向量 - 你很可能想要:as.matrix(D),例如:

barplot(as.matrix(data.frame(rpois(10, 2), rpois(10, 1))), beside = T)

基本上,我给出一个简单的例子,假设你有:

df = data.frame(x = c(1,2,3), y = c(2,3,4))

你正在做as.matrix(df $ x,df $ y) - 这不是你想要的,你想做的:as.matrix(df),因此:

barplot(as.matrix(df), beside = T)

会给你你想要的东西。关键是要看看“as.matrix”的作用。