Как построить 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 таким образом, чтобы левая сторона красной полосы находилась справа от синей полосы на оси х. Так же, как на картинке ниже.