如何用多轴标签在ggplot2中表示双极调查问题

时间:2017-02-08 17:30:41

标签: r ggplot2

我有来自格式问题的调查数据

| Statement A | Agree strongly w/ A| ... | Agree strongly w/ B | Statement B |
| A1          |         o          | ... |          o          | B1          |

我想用条形图显示每个语句的方法,条形图在条形图的两侧都有标签 - 左边一个用于语句A,另一个用于语句B,如下所示:

graph sketch http://tomvladeck.com/wp-content/uploads/2017/02/Screenshot-2017-02-08-12.28.43.png

我希望y轴线看到标签“Statement A”和“Statement B”下面的行,y轴标签显示框中的“A1”,“A2”和“B1” “,”B2“。使用ggplot时使用scale_y_discrete,您只能拥有一行(据我所知)并可以使用position = "right"将其移至右侧,但是afaik,您不能有两行轴线(即使它们是相同的比例)。

这没有多个y比例,我知道ggplot2本身不支持这些比例。从技术上讲,它有一个离散的y标度,但有两组标签,但我不知道如何在ggplot2中实现这一点,而不是使用大量的annotates。这里有什么帮助?这可以在天然ggplot中做到吗?

这是一个最小的代表:

example_df <- 
  data.frame(
    statement_a = c("I like to take risks", 
                    "I work to provide for my family"),
    statement_b = c("I am more risk averse",
                    "I work to provide for myself"),
    value = c(-1.5, .5)
  )

plot_1 <- 
  ggplot(example_df, 
         aes(x = statement_a, y = value)) + 
  geom_col() + 
  coord_flip() + 
  scale_x_discrete(name = "")

plot_2 <- 
    ggplot(example_df, 
         aes(x = statement_b, y = value)) + 
  geom_col() + 
  coord_flip() + 
  scale_x_discrete(name = "", position = "top")

情节A看起来像这样: Plot A http://tomvladeck.com/wp-content/uploads/2017/02/plot_a.jpeg

情节B看起来像这样: Plot B http://tomvladeck.com/wp-content/uploads/2017/02/plot_b.jpeg

这个想法是显示轴线的两个(A中左边的那个,B中右边的那个)

1 个答案:

答案 0 :(得分:1)

ggplot不支持多个y轴(除非它们都是数字,一个是另一个的比例)。关于此的帖子很多,你可以自己搜索。这是一个可以解决问题的解决办法。

example_df <- 
  data.frame(
    statement_a = c("I like to take risks", 
                    "I work to provide for my family"),
    statement_b = c("I am more risk averse",
                    "I work to provide for myself"),
    value = c(-1.5, .5)
  )

row_count <- nrow(example_df)
max_value <- max(abs(example_df$value))

example_df$y <- 1:row_count

library(ggplot2)

ggplot(example_df) +
  geom_rect(aes(xmin = rep(0, row_count), 
                xmax = value, 
                ymin = y-0.3, ymax = y+0.3)) +
  geom_text(aes(x = -max_value-0.2,
                y = y,
                label = statement_a),
            hjust = 1) +
  geom_text(aes(x = max_value-0.2,
                y = y,
                label = statement_b),
            hjust = 0) +
  xlim(c(-max_value-10,max_value+10)) +
  theme_void()

enter image description here