#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. Не используйте
$
insideaes
! Вы «хотите изменить свои данные, чтобы у вас больше не было переменной 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. Большое вам спасибо! Это именно то, что мне было нужно!