首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggplot2中的水平滑动条形图

ggplot2中的水平滑动条形图
EN

Stack Overflow用户
提问于 2013-07-12 04:37:01
回答 2查看 1.5K关注 0票数 3

我已经创建了所需的图,但我想滑动条形图,以便每个子图的中心中性类别均匀地跨过零(x=0)。有什么想法吗?也许我在这里没有使用正确的几何构造?

代码语言:javascript
复制
library(ggplot2)
survey_data <- data.frame(gender=rep(c("Unreported","Female","Male"),7),
                      feel_job=c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7),
                      Freq=c(0, 0, 0, 1, 3, 5, 0, 4, 4, 0, 7, 15, 3, 28, 35, 3, 35, 80, 1, 52, 108))
p <- ggplot(survey_data, aes(gender)) + 
  geom_bar(aes(y = Freq, fill = factor(feel_job)), stat = "identity") +
  coord_flip()
p

显然,这种类型的图在某些圈子里也被称为“发散堆叠条形图”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-12 07:03:14

我猜,因为在因子feel_job中有7个级别,所以您希望level =4在y轴上。从http://learnr.wordpress.com/2009/09/24/ggplot2-back-to-back-bar-charts/的例子中,我认为可能有一种作弊的方法。

关键似乎是不要依赖ggplot来做所有的事情。相反,你必须创建你的统计数据,然后摆弄它们。我决定尝试使用geom_rect()而不是普通的geom_bar(),这意味着我需要为每个条形图指定xmin, xmax, yminymax的值。这个答案的其余部分将展示如何做到这一点。

代码语言:javascript
复制
# save the data we were given
a.survey.data <-survey_data

# going to plot this as rectangles
a.survey.data$xmin[a.survey.data$feel_job < 4] = -a.survey.data$Freq[a.survey.data$feel_job < 4]
a.survey.data$xmin[a.survey.data$feel_job == 4] = -a.survey.data$Freq[a.survey.data$feel_job == 4]/2
a.survey.data$xmin[a.survey.data$feel_job > 4] = 0

a.survey.data$xmax[a.survey.data$feel_job < 4] = 0
a.survey.data$xmax[a.survey.data$feel_job == 4] = a.survey.data$Freq[a.survey.data$feel_job == 4]/2
a.survey.data$xmax[a.survey.data$feel_job > 4] = a.survey.data$Freq[a.survey.data$feel_job > 4]

# assign values to ymin and ymax based on gender and 
y.base <- NA
y.base[a.survey.data$gender == "Female"] = 1
y.base[a.survey.data$gender == "Male"] = 2
y.base[a.survey.data$gender == "Unreported"] = 3

a.survey.data$ymin <- y.base + (a.survey.data$feel_job-4)*0.1 - 0.05
a.survey.data$ymax <- y.base + (a.survey.data$feel_job-4)*0.1 + 0.05

# set the labels
a.survey.data$feel_job.cut <- factor(cut(a.survey.data$feel_job,
                                         breaks = c(0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5),
                                         labels = c("1",
                                                    "2",
                                                    "3",
                                                    "neutral",
                                                    "5",
                                                    "6",
                                                    "7"),
                                         ordered = TRUE))

p2 <- ggplot(data = a.survey.data,
             aes(xmax = xmax,
                 xmin = xmin,
                 ymax = ymax,
                 ymin = ymin)) +
  geom_rect(aes(fill = feel_job.cut)) +  
  scale_y_continuous(limits = c(0.5,3.5),
                     breaks=c(1,2,3), 
                     labels=c("Female","Male","Unreported"))
print(p2)

然后我们就开始..。

票数 2
EN

Stack Overflow用户

发布于 2013-07-12 05:24:34

您可以使用HH库中的likert函数来完成此操作:

代码语言:javascript
复制
library(HH)
survey_data <- data.frame(gender=rep(c("Unreported","Female","Male"),7),
                  feel_job=c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7),
                  Freq=c(0, 0, 0, 1, 3, 5, 0, 4, 4, 0, 7, 15, 3, 28, 35, 3, 35, 80, 1, 52, 108))
likert(Freq ~ gender + feel_job, survey_data)

我不确定这是否是您想要的,但在我看来,这(或非常类似的东西)应该可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17603023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档