2016-01-27 2 views
1

Когда у меня есть несколько категориальных переменных по оси x spineplot (базовая графика R), я часто обнаруживаю, что некоторые мои метки отсутствуют. Есть ли способ сделать метки оси x вертикальными? Или еще лучше, есть ли способ, чтобы сделать spineplots, используя ggplot. Я знаю, что могу делать сшитые с переменной шириной штрих-коды, но они, похоже, являются болью, чтобы сделать их и даже больше боли, чтобы получить ширину баров переменной ширины. Хотя spineplots приятные и легкие, я хотел бы иметь больше контроля над тем, как они выглядят.Шпинели в ggplot или, по крайней мере, вертикальные метки

Возпроизводимо пример:

spineplot(factor(mpg$drv)~factor(mpg$manufacturer), 
      xlab = "Manufacturer", ylab = "Wheel Drive") 

#mpg comes from library(ggplot2) 

Здесь у меня есть 15 производителей, но десять этикеток. Я также хотел бы иметь цвет. spineplot r Я нашел эти сообщения, но я не нахожу решение особенно легко

How to make variable bar widths in ggplot2 not overlap or gap

Variable Width Bar Plot

ответ

3

Это берет некоторые манипуляции, частично основано на this answer, для вычисления необходимого ширины и положения каждого стержня. Я решил сделать манипуляцию с помощью dplyr, в какой момент вы можете создать нужный spinegram:

library(dplyr) 
d <- mpg %>% 
    count(manufacturer, drv) %>% 
    mutate(total = sum(n), fraction = n/total) 

lab <- d %>% 
    distinct(manufacturer) %>% 
    select(manufacturer, total) %>% 
    ungroup() %>% 
    mutate(position = .5 * (cumsum(total) + cumsum(lag(total, default = 0)))) 

d %>% 
    inner_join(lab) %>% 
    ggplot(aes(position, fraction, fill = drv, width = total)) + 
    geom_bar(stat = "identity") + 
    scale_x_continuous(labels = lab$manufacturer, breaks = lab$position) + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) + 
    xlab("Manufacturer") 

ggplot2 spineplot

Смежные вопросы