我已经创建了所需的图,但我想滑动条形图,以便每个子图的中心中性类别均匀地跨过零(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显然,这种类型的图在某些圈子里也被称为“发散堆叠条形图”。
发布于 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, ymin和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-12 05:24:34
您可以使用HH库中的likert函数来完成此操作:
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)我不确定这是否是您想要的,但在我看来,这(或非常类似的东西)应该可以工作。
https://stackoverflow.com/questions/17603023
复制相似问题