Наложение двух графиков с помощью geom_bar()

Я пытаюсь наложить два барных графика друг на друга, а не рядом. Данные из того же набора данных. Я хочу, чтобы "Блок" на оси абсцисс, а также "Начало" и "Конец" в качестве наложенных графиков.

    Block   Start       End
1    P1L     76.80       0.0
2    P1S     68.87       4.4
3    P2L     74.00       0.0
4    P2S     74.28       3.9
5    P3L     82.22       7.7
6    P3S     80.82      17.9

Мой сценарий

 ggplot(data=NULL,aes(x=Block))+
    geom_bar(data=my_data$Start,stat="identity",position ="identity",alpha=.3,fill='lightblue',color='lightblue4')+
    geom_bar(data=my_data$End,stat="identity",position ="identity",alpha=.8,fill='pink',color='red')

Я получаю сообщение об ошибке: ggplot2 не знает, как обращаться с данными числового класса

Я также пытался

    ggplot(my_data,aes(x=Block,y=Start))+
      geom_bar(data=my_data$End, stat="identity",position="identity",...)

Кто-нибудь знает, как я могу это сделать? Спасибо.

Редактировать:

Как получить увертливость наложения баров?

Я редактирую этот пост, потому что мой следующий вопрос актуален, так как это противоположная проблема моего оригинального поста.

@ P.merkle

Мне пришлось изменить свой график на четыре столбца, показывающих средние значения всех блоков, помеченных буквами L и S. Буква L обозначает литораль, а буква S - сублитораль. Они подвергались двум процедурам: нормальному и уменьшенному.

Я рассчитал средства и их стандартное отклонение. Мне нужны четыре бара с соответствующими им барами ошибок: нормальный / литоральный, уменьшенный / литоральный, нормальный / сублиторальный, уменьшенный / сублиторальный.

Проблема в том, что когда я строю график, и прибрежные полосы, и обе сублиторальные полосы перекрывают друг друга! Так что теперь я хочу, чтобы они не перекрывались! Как я могу сделать это? Я перепробовал все виды position = 'dodge' а такжеposition = position_dodge(newdata$Force)без везения...

мой newdata содержать эту информацию:

Zonation Force N mean sd se 1 Litoral Normal 6 0.000000 0.000000 0.000000 2 Litoral Redusert 6 5.873333 3.562868 1.454535 3 Sublitoral Normal 6 7.280000 2.898903 1.183472 4 Sublitoral Redusert 6 21.461667 4.153535 1.695674

Мой сценарий такой:

ggplot(data=cdata,aes(x=newdata$Force,y=newdata$mean))+
        geom_bar(stat="identity",position ="dodge",
                 alpha=.4,fill='red', color='lightblue4',width = .6)+
        geom_errorbar(aes(ymin=newdata$mean-sd,ymax=newdata$mean+sd),
                      width=.2, position=position_dodge(.9))

Результат, к сожалению, это

Что касается баров ошибок, то здесь явно четыре бара, но они перекрываются. Пожалуйста, как я могу решить это?

1 ответ

Решение

Существует простой и более сложный ответ на ваш вопрос.

Если вам не нужна легенда, простое решение может сработать для вас.

Если вы хотите отобразить легенду рядом с гистограммой, рассмотрите возможность использования более сложного решения, которое требует преобразования ваших данных из широкоформатного формата в длинный.

Вариант 1: без легенды, хранение данных в широком формате

Вы можете уточнить свои эстетические характеристики на уровне отдельных геомов (здесь, geom_bar):

ggplot(data=my_data,aes(x=Block))+
  geom_bar(aes(y=Start),stat="identity",position ="identity",alpha=.3,fill='lightblue',color='lightblue4') +
  geom_bar(aes(y=End),stat="identity",position ="identity",alpha=.8,fill='pink',color='red')

сюжет без легенды

Вариант 2. Добавление легенды путем преобразования данных в длинный формат

Чтобы добавить легенду, используйте reshape2::melt преобразовать ваш фрейм данных из широкого формата в длинный формат, который дает вам столбцы variable ("Начало" против "Конец") и value, Затем используйте variable столбец для определения вашей легенды:

library(reshape2)
my_data_long <- melt(my_data, id.vars = c("Block"))
ggplot(data=my_data_long,aes(x=Block, y=value, fill=variable, color=variable, alpha=variable)) +
  geom_bar(stat="identity",position ="identity") +
  scale_colour_manual(values=c("lightblue4","red")) +
  scale_fill_manual(values=c("lightblue","pink")) +
  scale_alpha_manual(values=c(.3, .8))

Другие вопросы по тегам