Как построить 2-осевую диаграмму с столбцами рядом без повторного масштабирования данных

Мои данные таковы:

structure(list(Year = 1994:2016, Kcalpd = c(86L, 91L, 98L, 107L, 
116L, 126L, 123L, 112L, 103L, 102L, 103L, 92L, 77L, 59L, 43L, 
29L, 19L, 14L, 13L, 12L, 12L, 10L, 9L), Thtonnes = c(728.364, 
757.467, 780.423, 792.756, 701.685, 720.71, 677.292, 761.649, 
668.218, 679.042, 974.355, 1005.035, 1123.09, 1055.07, 1092.498, 
1100.654, 899.767, 1018.462, 1046.096, 1084.173, 1158.217, 802.194, 
276.773)), row.names = c(NA, -23L), class = "data.frame", .Names = c("Year", 
"Kcalpd", "Thtonnes"))

И мой код выглядит следующим образом:

scaleFactor <- max(wfd$Thtonnes) / max(wfd$Kcalpd)

ggplot(wfd, aes(x=Year)) +
  geom_col(aes(y=Thtonnes), fill="blue") +
  geom_col(aes(y=Kcalpd * scaleFactor), fill="red") +
  scale_y_continuous(name="Thtonnes", sec.axis=sec_axis(~./scaleFactor, name="Kcalpd")) +
  theme(
    axis.title.y.left=element_text(color="blue"),
    axis.text.y.left=element_text(color="blue"),
    axis.title.y.right=element_text(color="red"),
    axis.text.y.right=element_text(color="red")
  )

Этот код адаптирован с сайта: график с двумя осями y, одной осью y слева и другой осью y справа, заданной Megatron. Эта веб-ссылка является хорошим решением для построения графика и линии на одном графике. Но это не приводит меня к выводу двух разно масштабированных данных в виде столбцов на одном графике. Поэтому в моих силах достигли стадии ниже, как сейчас. Проблема в том, что мои бары находятся один за другим, как показано на рисунке ниже. Я хочу, чтобы их рисовали бок о бок каждый год.

Смотрите картинку ниже: https://stack ru.com/images/284bb4e82990c69f7a510849d1e39b5101515560.png

Вопрос вовсе не дублирует ссылку, указанную мной и NortonGon. Причина, по которой он не повторяется, заключается в следующем: 1) Нигде не были построены две гистограммы разного масштаба. В большинстве случаев это делается путем огранки. 2) Я уже продемонстрировал, что можно построить два разных бара без масштабирования на двух разных осях Y. 3) Если дублирующий тег будет удален, то я тоже выложу код.

4 ответа

Окончательный ответ с кодом выглядит следующим образом:

Код для приведенной выше диаграммы выглядит следующим образом:

А) Данные

structure(list(Year = 1994:2016, Kcalpd = c(86L, 91L, 98L, 107L, 
116L, 126L, 123L, 112L, 103L, 102L, 103L, 92L, 77L, 59L, 43L, 
29L, 19L, 14L, 13L, 12L, 12L, 10L, 9L), Tonnes = c(728364, 757467, 
780423, 792756, 701685, 720710, 677292, 761649, 668218, 679042, 
974355, 1005035, 1123090, 1055070, 1092498, 1100654, 899767, 
1018462, 1046096, 1084173, 1158217, 802194, 276773)), row.names = c(NA, 
-23L), class = "data.frame", .Names = c("Year", "Kcalpd", "Tonnes"
))

Б) код

scaleFactor <- max(wfd$Tonnes) / max(wfd$Kcalpd)

ggplot(wfd, aes(x=Year,  width=.4)) +
  geom_col(aes(y=Tonnes), fill="blue", position = position_nudge(x = -.4)) +
  geom_col(aes(y=Kcalpd * scaleFactor), fill="red") +
  scale_y_continuous(name="Tonnes (Rice + Wheat)", sec.axis=sec_axis(~./scaleFactor, name="Kcal per day")) +
  scale_x_continuous(breaks = seq(1994, 2016, 4)) +
  theme(
    axis.title.y.left=element_text(color="blue"),
    axis.text.y.left=element_text(color="blue"),
    axis.title.y.right=element_text(color="red"),
    axis.text.y.right=element_text(color="red")
  ) +
  labs(title = "Food Security in Venezuela, Cereals Production and Food Gap", x = element_blank())

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

Вот решение, на которое я ссылался в своем комментарии:

library(ggplot2)
library(data.table)

wfd <- structure(list(Year = 1994:2016, Kcalpd = c(86L, 91L, 98L, 107L, 
                                                   116L, 126L, 123L, 112L, 103L, 102L, 103L, 92L, 77L, 59L, 43L, 
                                                   29L, 19L, 14L, 13L, 12L, 12L, 10L, 9L), Thtonnes = c(728.364, 
                                                                                                        757.467, 780.423, 792.756, 701.685, 720.71, 677.292, 761.649, 
                                                                                                        668.218, 679.042, 974.355, 1005.035, 1123.09, 1055.07, 1092.498, 
                                                                                                        1100.654, 899.767, 1018.462, 1046.096, 1084.173, 1158.217, 802.194, 
                                                                                                        276.773)), row.names = c(NA, -23L), class = "data.frame", .Names = c("Year", 
                                                                                                                                                                             "Kcalpd", "Thtonnes"))



wfd.m <- melt(wfd, id.vars = 1)

ggplot(wfd.m, aes(Year, value, fill = variable)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c("Thtonnes" = "blue", "Kcalpd" = "red")) +
  facet_wrap(~variable, ncol = 1, scales = "free_y") +
  theme(legend.position = "none") +
  ylab("your label here")

Создано в 2019-01-28 пакетом представлением (v0.2.1)

Благодаря NelsonGon, сама идея, что это невозможно сделать, была достаточно хороша, чтобы спровоцировать решение во мне, и вот результат. h ttps://s tackru.com/images/a3018e72b0cd5ea6f4c04fe828fbe58166dfa072.png

Если вы ответите на мой предыдущий ответ, то в позиционировании стержней есть небольшой недостаток. Они не сидят, как по центру с галочками оси X. Я имею в виду, что синие столбцы были смещены вправо, а красные столбцы отображаются по центру относительно отметок оси X в предыдущих решениях.

В идеале, они оба должны быть центрированы по оси x таким образом, чтобы левая сторона красной полосы находилась справа от синей полосы на оси х. Так же, как на картинке ниже.

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