【问题标题】:How to draw barplot with both stacked and sided bars in R?如何在R中绘制带有堆叠条和边条的条形图?
【发布时间】:2014-06-29 05:04:32
【问题描述】:

我有三个变量,支持、政党和性别。支持分为三个级别,1 表示是,2 表示否,3 表示神经。政党和性别是虚拟变量。现在让我们伪造它们:

support = sample(1:3, size=100, replace=T)
party = as.numeric(rbinom(100, 100, 0.4) > 42)
gender = as.numeric(rbinom(100, 100, 0.4) > 39)

我想查看以政党和性别为条件的支持百分比。到目前为止,我可以只根据一个变量来计算百分比,比如派对。

counts = table(support,party)
percent = t(t(counts)/colSums(counts))
barplot(percent)

我如何按性别划分政党并将性别并排放置,同时保持当前方式的政党支持? (如果你不明白我在说什么,请继续阅读......)

为了清楚起见,我希望将第一个柱形栏 0(party = 0)分成两个相邻的柱形栏,每个柱形栏对应一个性别。然后我希望将第二个柱栏 1 (party=1) 分成两个相邻的柱栏,每个性别一个。对于每个特定的列栏,我希望它像现在一样堆叠起来。

我什至不确定这是否可以实现。

顺便问一下,有没有办法控制条的宽度?它们对我的口味来说太宽了。

【问题讨论】:

标签: r bar-chart stacked


【解决方案1】:

这样的事情怎么样,我们可以调用barplot 两次,将两组放在同一个表面上。首先,我命名了一些数据,以便跟踪它

#sample data
set.seed(15)
support = sample(1:3, size=100, replace=T)
party = factor(as.numeric(rbinom(100, 100, 0.4) > 42), levels=0:1, labels=c("D","R"))
gender = factor(as.numeric(rbinom(100, 100, 0.4) > 39), levels=0:1, labels=c("M","F"))

现在我们分别为每一方汇总数据

tt<-table(support, gender, party)
p1<-tt[,,1]
p1<-p1/sum(p1)

p2<-tt[,,2]
p2<-p2/sum(p2)

现在我们合并条形图

xx<-barplot(p1, width=.3, space=c(.25,.6), xaxt="n", 
    xlim=c(0,2.4), ylim=c(0, max(colSums(p1), colSums(p2))))
axis(1,xx, levels(gender), line=0, tick=F)
yy<-barplot(p2, width=.3, space=c(5, .6), xaxt="n", add=T)
axis(1,yy, levels(gender), line=0, tick=F)

axis(1, c(mean(xx), mean(yy)), levels(party), line=1, tick=F)

这会产生

【讨论】:

  • 从来不知道可以将条形图添加到条形图上。谢谢!
【解决方案2】:

我会使用ggplot2 执行此操作,但不会并排放置条形图,而是使用子图(或ggplot2 行话中的方面):

df = data.frame(support, party, gender)
library(ggplot2)
ggplot(df, aes(x = factor(party), fill = factor(support))) + 
    geom_bar() + facet_wrap(~ gender)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2021-03-21
    • 2019-09-25
    • 1970-01-01
    相关资源
    最近更新 更多