3

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

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

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

4

2 回答 2

2

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

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

# 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)

然后我们就... 在此处输入图像描述

于 2013-07-11T23:03:14.093 回答
0

您可以使用库中的likert函数来执行此操作HH

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)

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

于 2013-07-11T21:24:33.763 回答