R изменить масштаб 2-й оси Y в соответствии с переменной

Я пытался получить гистограмму и линейный график в один график. Гистограмма показывает точное количество назначенного антибиотика (левая ось Y). Линейный график представляет собой процент использования этого антибиотика (правая ось). Пока что я объединил их вместе, переместил правую ось вправо, но правая ось Y использует тот же масштаб, что и левая. Масштабы гистограммы и линейного графика, конечно, очень сильно различаются.

Некоторая информация, прежде чем мой вопрос начнется:

  • имя фрейма данных = Grafiek3
  • n_fosfo = количество записей (используется для левой оси Y)
  • Jaren = годы, количество и процент видны за год (используется для оси x)
  • per_fos = процент (используется для правой оси Y), составляет примерно 11%

Код, который у меня есть сейчас:

  ggplot(Grafiek3, aes(x = Jaren, y =n_fosfo)) + #samenvoegen
geom_bar(stat="identity", fill="#69b3a2" ) +
scale_x_continuous(labels = as.character(Grafiek3$Jaren), breaks = Grafiek3$Jaren) +
xlab ("Year") +
theme(plot.title = element_text(hjust = 0.5)) +
ggtitle("Increase fosfomycin prescriptions per year")+
geom_line(aes(x=Jaren, y=per_fos), color="black") +
geom_point(aes(x=Jaren, y=per_fos), shape=21, color="black", fill="#69b3a2", size=2) +
scale_y_continuous(
  name = expression("Total amount of prescriptions"), 
  sec.axis = sec_axis(~., name = "Percentage")) +
theme(plot.title = element_text(hjust = 0.5)) +
ggtitle("Percentage of fosfomycin prescriptions per year")

Вывод выглядит следующим образом: Незавершенный график

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

  ggplot(Grafiek3, aes(x=Jaren, y =per_fos)) + #line graph
  geom_line(color="grey") +
  geom_point(shape=21, color="black", fill="#69b3a2", size=2) +
  scale_x_continuous(labels = as.character(Grafiek3$Jaren), breaks = Grafiek3$Jaren) +
  scale_y_continuous(position = "right") +
  xlab ("Year") +
  ylab ("Percentage") +
  theme(plot.title = element_text(hjust = 0.5)) +
  ggtitle("Percentage of fosfomycin prescriptions per year")

Изображение: Линейный график

Я видел, что изменение кода:

sec.axis = sec_axis(~., name = "Percentage"))

во что-то вроде этого:

sec.axis = sec_axis(~./42, name = "Percentage"))

Исправим, но, к сожалению, меняется только правая ось, а линейный график не двигается вместе с ней.

Итак, кто-нибудь знает, как я могу переместить линейный график (изображение) в гистограмму? Или как изменить правую ось, чтобы она использовала информацию переменной "per_fos"?

Сформированный набор данных, который может быть полезен:

years <- c(2013, 2014, 2015, 2016, 2017, 2018, 2019)
amount <- c(120, 150, 200, 170, 180, 240, 80)
percentage <- c(5.4, 5.9, 6.3, 7.1, 7.8, 8.4, 10.4)
df <- data.frame(years, amount, percentage)

person Roontje    schedule 21.05.2020    source источник
comment
Добро пожаловать в СО. Не могли бы вы сделать свой вопрос воспроизводимым: включите минимальный набор данных в виде объекта, например, если фрейм данных как df ‹- data.frame(…) где … ваши переменные и значения или используйте dput(head(df)) . Включите код, который вы пробовали, и изложите ожидаемый ответ. Эти ссылки должны помочь: минимальный воспроизводимый пример и Как спросить   -  person Peter    schedule 21.05.2020
comment
К сожалению, я не могу использовать настоящий набор данных из соображений конфиденциальности. Я попытаюсь настроить составленный набор данных. Ожидаемый ответ уже представлен в виде 2-х предоставленных мной картинок, а также описания того, как это должно быть. Реальная картина ожидаемого ответа конечно невозможна, иначе задал бы свой вопрос. Коды, которые я использовал, также представлены.   -  person Roontje    schedule 21.05.2020
comment
Это было бы здорово, часто лучше использовать упрощенный набор данных для работы над проблемой.   -  person Peter    schedule 21.05.2020
comment
Спасибо за улучшение моего вопроса!   -  person Roontje    schedule 21.05.2020


Ответы (1)


Просто чтобы вы знали, что две оси Y с разными масштабами не считаются хорошей практикой. Вот почему нелегко сделать то, что вы пытаетесь сделать с ggplot2. См. эту ссылку для хорошего обсуждения проблемы: >ggplot с двумя осями Y с каждой стороны и разными масштабами



library(ggplot2)
library(dplyr)
library(scales)


years <- c(2013, 2014, 2015, 2016, 2017, 2018, 2019)
amount <- c(120, 150, 200, 170, 180, 240, 80)
percentage <- c(5.4, 5.9, 6.3, 7.1, 7.8, 8.4, 10.4)

df <- data.frame(years, amount, percentage)
# create a modified percentage column to fit in with the scale of the columns:

df <- 
  df %>% 
  mutate(pc_rescale = rescale(percentage, to = c(20, 200)))

# plot and add suitable labels; if you want the labels scaled evenly you need to unpick the rescaling function. 

ggplot(df, aes(years, amount)) +
  geom_col()+
  geom_line(aes(years, pc_rescale))+
  scale_y_continuous(sec.axis = sec_axis(~., labels = df$percentage, breaks = df$pc_rescale, name = "Percentage" ))

Создано 21 мая 2020 г. с помощью пакета reprex (v0.3.0)

person Peter    schedule 21.05.2020
comment
Большое спасибо! Это мне очень помогло! Теперь я могу доработать граф до соответствующих нужд. - person Roontje; 22.05.2020
comment
К сожалению, я не могу получить правильную ось с правильными шкалами. изменение этого кода: scale_y_continuous(sec.axis = sec_axis(~., labels = df$percentage, breaks = df$pc_rescale, name = Percentage )) To: scale_y_continuous(sec.axis = sec_axis(~/40., name = Percentage) )) тоже дает неправильные пропорции. Как я могу иметь тот же масштаб, что и на моем изображении линейного графика? Но с номерами от 4 до 11? Итак, нижняя часть начинается с 4 вместо 0. - person Roontje; 22.05.2020
comment
Ничего, я исправил это, изменив количество масштабов и изменив разрывы и метки. - person Roontje; 22.05.2020
comment
Вот так. Если это отвечает на ваш вопрос, принято нажимать «Принять»: stackoverflow.com/help/someone-answers - person Peter; 22.05.2020