堆积条形图中的负值因子

时间:2017-09-12 10:14:20

标签: r ggplot2

我试图找出一种在ggplot2的堆积条形图中引入因子的负值的方法。这些数据是芬兰议员对基本收入的支持程度。它位于帖子的底部。

我可以使用以下代码获得一个类似于我想要的情节(减去负值因子):

library(forcats)
library(ggplot2)


support.plot <- ggplot(mpsupport.df, aes(fct_infreq(Party))) +
geom_bar (aes(fill=Support)) + 
coord_flip() +
theme(legend.position = "bottom")+
ylab("Party") +
xlab("Number of MPs")

这给出了以下内容:

Stacked bar chart of MP support for basic income

我想要的是图表以青绿色边界为中心,因此对基本收入的支持是向右的,而反对是在左边。这有意义吗?

数据:

   > dput(mpsupport.df)
structure(list(Party = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 6L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 
7L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 
3L, 3L, 3L, 3L, 3L, 5L, 6L, 7L, 7L, 7L), .Label = c("National Coalition", 
"Centre Party", "Social Democratic Party", "Left Alliance", "Christian Democrats", 
"True Finns", "Swedish People's Party", "Greens"), class = "factor"), 
    Support = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L), .Label = c("fully.agree", "partially.agree", 
    "partially.disagree", "fully.disagree"), class = "factor")), .Names = c("Party", 
"Support"), row.names = c("1", "2", "2.1", "2.2", "2.3", "2.4", 
"4", "4.1", "4.2", "4.3", "4.4", "4.5", "4.6", "4.7", "6", "8", 
"8.1", "8.2", "8.3", "8.4", "8.5", "8.6", "8.7", "8.8", "8.9", 
"8.10", "8.11", "8.12", "8.13", "8.14", "9", "9.1", "9.2", "9.3", 
"9.4", "9.5", "9.6", "9.7", "10", "10.1", "10.2", "10.3", "10.4", 
"10.5", "10.6", "10.7", "10.8", "10.9", "10.10", "10.11", "10.12", 
"10.13", "10.14", "10.15", "10.16", "10.17", "10.18", "10.19", 
"10.20", "10.21", "10.22", "10.23", "10.24", "10.25", "10.26", 
"10.27", "10.28", "10.29", "10.30", "10.31", "10.32", "10.33", 
"11", "11.1", "11.2", "11.3", "12", "12.1", "12.2", "12.3", "13", 
"14", "14.1", "14.2", "14.3", "14.4", "14.5", "14.6", "14.7", 
"14.8", "14.9", "14.10", "14.11", "14.12", "14.13", "14.14", 
"14.15", "14.16", "14.17", "14.18", "14.19", "14.20", "15", "15.1", 
"17", "17.1", "17.2", "17.3", "17.4", "17.5", "17.6", "17.7", 
"17.8", "17.9", "17.10", "17.11", "17.12", "17.13", "17.14", 
"17.15", "17.16", "17.17", "17.18", "17.19", "18", "18.1", "18.2", 
"18.3", "18.4", "18.5", "18.6", "18.7", "19", "19.1", "19.2", 
"19.3", "19.4", "19.5", "19.6", "19.7", "19.8", "19.9", "19.10", 
"19.11", "19.12", "19.13", "19.14", "19.15", "19.16", "19.17", 
"19.18", "19.19", "19.20", "19.21", "19.22", "19.23", "21", "21.1", 
"22", "22.1", "22.2", "22.3", "22.4", "22.5", "22.6", "22.7", 
"22.8", "22.9", "22.10", "22.11", "22.12", "23", "23.1", "23.2", 
"23.3", "25", "25.1", "25.2", "25.3", "25.4", "25.5", "25.6", 
"27", "27.1", "27.2", "27.3", "27.4", "27.5", "29", "30", "31", 
"31.1", "31.2"), class = "data.frame")

1 个答案:

答案 0 :(得分:5)

尝试以下几点:

library(ggplot)
library(forcats) 
mpsupport.df$dummy = ifelse(mpsupport.df$Support %in% c("fully.agree", "partially.agree"), 1, -1)

agg = aggregate(dummy ~ Support + Party, data = mpsupport.df, FUN = sum)

ggplot(data = agg)+
  geom_bar (aes(y = dummy, x= fct_infreq(Party), fill = factor(Support, levels = c("fully.agree", "partially.agree", "fully.disagree" ,"partially.disagree"))), stat= "identity") + 
  coord_flip()+
  theme(legend.position = "bottom", legend.title = element_blank())

enter image description here