Масштабирование второго набора данных в линейном графике ggplot2 - PullRequest
1 голос
/ 11 июля 2019

Я хочу отобразить второй набор данных (оранжевая линия, «Годовой») на вторичной оси, потому что его значения намного меньше, чем значения первого набора данных (красная линия, «Накопительный»).Мне удалось масштабировать вторичную ось Y, но у меня проблемы с повторным масштабированием второго набора данных, потому что оба набора данных считываются вместе, и я не знаю, как обрабатывать второй набор данных отдельно в коде.

Данные выглядят следующим образом

Год Совокупный Годовой 1960 1 1 1961 1 0 1962 1 0 1963 2 1 ... 2019 334 9

Буду признателен за любые конструктивные комментарии!

library("ggplot2")
library("reshape2")
library("tidyverse")

sec_scale=1/10
datu_sub=data[,c(2,3,1)]
datu=melt(datu_sub,id=c("Year"))
p1<-ggplot(datu)+geom_line(aes(x=Year,y=value,colour=variable),linetype="solid",size=1.1)+
  geom_point(aes(x=Year,y=value,colour=variable),shape=1,size=3,stroke=1.5)+
  scale_colour_manual(values=c("darkorange","red"))+
  scale_y_continuous(sec.axis=sec_axis(~.*sec_scale,name="Annual\n"))
p1<-p1+labs(x="\nYear",y="Cumulative\n")
p1+theme(axis.title.x=element_text(size=18),
         axis.text.x=element_text(size=14),
         axis.title.y=element_text(size=18),
         axis.text.y=element_text(size=14),
         axis.ticks=element_blank(),
         legend.title=element_blank(),
         legend.position=c(0.12,0.89),
         legend.text=element_text(size=14),
         legend.background=element_rect(fill="white",size=0.5,linetype="dotted"))

1 Ответ

0 голосов
/ 12 июля 2019

Я не смог уместить все в комментарии, поэтому напишу это как ответ. Мне пришлось импровизировать некоторые данные, потому что у меня нет вашего пригодного для использования образца, но код построения должен быть похожим.

sec_scale=1/10
# I made up some data because I don't have yours
datu <- data.frame(Year = c(2000:2010, 2000:2010),
                   value = c(rnorm(11, 500, 10), rnorm(11, 5000, 100)),
                   variable = rep(c("Annual", "Cumulative"), each = 11))

Теперь для построения графика я удалил аргументы mapping / aes() из geoms в основную функцию ggplot, и geom унаследует эти отображения из основного вызова ggplot.

Далее вы заметите, что я переопределил y = ifelse(variable == "Cumulative, sec_scale, 1) * value, который масштабирует все value с, для которых variable == "Cumulative", на сумму в sec_scale

p1<-ggplot(datu, aes(x = Year, 
                     y = ifelse(variable == "Annual", 1/sec_scale, 1) * value, 
                     colour = variable)) + 
  geom_line(linetype = "solid", size = 1.1) +
  geom_point(shape = 1, size = 3, stroke = 1.5) +
  scale_colour_manual(values = c("darkorange", "red")) +
  scale_y_continuous(sec.axis = sec_axis(~.*sec_scale,name = "Annual\n")) +
  labs(x="\nYear",y="Cumulative\n") + 
  theme(axis.title.x = element_text(size=18),
        axis.text.x = element_text(size=14),
        axis.title.y = element_text(size=18),
        axis.text.y = element_text(size=14),
        axis.ticks = element_blank(),
        legend.title = element_blank(),
        legend.position = c(0.12,0.89),
        legend.text = element_text(size=14),
        legend.background = element_rect(fill="white",size=0.5,linetype="dotted"))

Для меня сюжет выглядел так:

enter image description here

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

...