Как отобразить сгруппированные столбцы, не начинающиеся с нуля?

#r #ggplot2 #bar-chart

#r #ggplot2 #столбчатая диаграмма

Вопрос:

У меня есть следующий фрейм данных

 unit <- c("a", "b", "c", "d")
top1990 <- c(100, 80, 70, 90)
base1990 <- c(40, 60, 20, 30)
top2000 <- c(120, 85, 65, 80)
base2000 <- c(40, 65, 25, 15)
df <- data.frame(unit, top1990, base1990, top2000, base2000)

unit top1990 base1990 top2000 base2000
a     100       40     120       40
b      80       60      85       65
c      70       20      65       25
d      90       30      80       15
  

Мне нужно отобразить на одном графике для каждого блока два столбца, один для 1990 года, а другой для 2000 года. Каждый столбец должен начинаться со значения «base ***» и заканчиваться значением «top ****». Мне также нужно упорядочить единицы измерения по «top1990» (в порядке убывания).

Я использовал функцию geom_segment библиотеки ggplot2 следующим образом

 df$unit <- factor(df$unit, levels = df$unit[order(df$top1990, decreasing = T)])    

ggplot(data = df)   geom_segment(aes(x=df$unit, xend=df$unit, y=df$top1990, yend=df$base1990), size = 7, color = "blue")  
geom_segment(aes(x=df$unit, xend=df$unit, y=df$top2000, yend=df$base2000), size = 7, color = "red")
  

Тем не менее, я получил это, в котором столбцы перекрываются, хотя они мне понадобились бы рядом.

введите описание изображения здесь

Чего мне не хватает?

Комментарии:

1. Я не совсем уверен, как именно вы хотите, чтобы выглядел сюжет, но я думаю, вам нужно преобразовать в длинный формат из широкого и использовать geom_bar для создания bar plot . Вам не нужно вызывать свои данные с помощью df$ , это указано в ggplot вызове в начале, поэтому все, что вам нужно сделать, это, например, aes( x=unit,..)

2. Для каждого блока я хотел бы отобразить два столбца (1990 и 2000) рядом. Согласно тому, что я исследовал в Интернете, с помощью geom_bar все столбцы начинаются с одного и того же значения (и это не мой случай, например, мне нужно указать, что столбец 1990 для блока «a» начинается с 40, а столбец 1990 для блока «b» — с 60 и так далее).

3. Итак, вы хотите, чтобы красные и синие столбцы располагались рядом, или a, b, c, d рядом?

4. Не используйте $ inside aes ! Вы «хотите изменить свои данные, чтобы у вас больше не было переменной year в заголовках столбцов, затем создайте один geom_segment и используйте position аргумент.

Ответ №1:

Я думаю, что сначала необходимо преобразовать ваши данные. Я предлагаю {cdata} для ваших нужд преобразования. Я думаю, что вам нужен geom_linerange() более толстый размер, такой, чтобы они выглядели как прямоугольники.

 unit <- c("a", "b", "c", "d")
top1990 <- c(100, 80, 70, 90)
base1990 <- c(40, 60, 20, 30)
top2000 <- c(120, 85, 65, 80)
base2000 <- c(40, 65, 25, 15)

df <- data.frame(unit, top1990, base1990, top2000, base2000)

library(cdata)
library(ggplot2)

control_table <- 
  qchar_frame(
    year, base      , top       |
    1990, "base1990", "top1990" |
    2000, "base2000", "top2000" 
  )

df_2 <- 
  rowrecs_to_blocks(
    df, controlTable = control_table,
    controlTableKeys = "year",
    columnsToCopy = "unit"
  )

df_2 %>% 
  ggplot(aes(unit, ymin = base, ymax = top, color = year))  
  geom_linerange(position = position_dodge(width = 1), size = 20)
  

С помощью {cdata} я преобразовал ваши данные в эту форму

   unit year base top
1    a 1990   40 100
2    a 2000   40 120
3    b 1990   60  80
4    b 2000   65  85
5    c 1990   20  70
6    c 2000   25  65
7    d 1990   30  90
8    d 2000   15  80
  

Теперь мы можем использовать base as ymin и top as ymax as aesthetics для geom_linerange() .

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

От основания до вершины с толстым диапазоном линий

Я надеюсь, это поможет.

Комментарии:

1. Большое вам спасибо! Это именно то, что мне было нужно!