Добавление линии, независимой от y, к оси в R - PullRequest
1 голос
/ 12 апреля 2019

У меня есть таблица с некоторым столбцом, скажем: 1910-1935 годы, количество проданных товаров и среднее арифметическое в последнем столбце.

Я пытаюсь построить это в ggplot в R. И я получил правильный график для среднего года.Но моя проблема заключается в следующем: мне нужно добавить линию на этот график с проданными годами продуктами.Они имеют совершенно другое значение (первый график имеет значение Y: 0 - 3,5, второй: 0 - 1400).Поэтому, если я попытаюсь добавить свою вторую строку, первые значения станут плоскими.

Как я могу включить вторую диаграмму так, чтобы годы основывались на оси X (т.е. годы от первой диаграммы), а проданные продукты получали новую ось Y2 справа (чтобы они не сглаживалидиаграмма)?

Я пытался добавить новый график к другому, но Y2 не подходил к первой области графика (у меня была ось Y2 внутри области графика).

Код:

par(mar=c(5,5,5,5))
ggplot(prod, aes(year, mean)) + 
  geom_line(colour = "red")

#ggplot(prod, aes(year, numOfProd)) + geom_line() 
ggplot(prod, aes(year, mean)) + geom_smooth(method="glm", formula=y~poly(x,3), se=FALSE, colour ="red") +
  geom_smooth(method = "lm", formula=y~x, se = FALSE, colour = "blue") +
  stat_smooth(method = "lm", colour = "blue") +
  #geom_point() +
  xlab("year of sold") + ylab("Mean[%]") +
  scale_x_continuous(breaks = seq(min(inbred_wszystko$rur), max(prod$year), by = 5)) +
  scale_y_continuous(breaks = seq(min(prod$mean), max(prod$mean), by = 0.2))

par(new=TRUE)


## Plot the second plot and put axis scale on right

    par(mar=c(5,5,5,5))
    plot(prod$year, all_prod$numOfprod, xlab="", ylab="", ylim=c(0,1500), 
         axes=FALSE, type="l", col="dark green")
    mtext("Example",side=4,col="black",line=4) 
    axis(4, ylim=c(0,1500), col="black",col.axis="black",las=2)

Итак, резюме: мне нужно добавить строку из второго сюжета (после второго комментария) в первый сюжет.Они основаны на одном и том же X.axis, но значения на Y разные.А также мне нужно добавить ось Y2 для этой линии на правой стороне графика.Может кто-нибудь помочь?

РЕДАКТИРОВАТЬ: Пример данных:

year    mean    soldProd
1910    0.5 798
1911    0.6 4234
1912    0.3 25
1913    0.1 2423
1914    0.6 4242
1915    0.3 5
1916    0.1 21
1917    0.11    442
1918    0.5 2353
1919    0.6 23
1920    0.3 42
1921    0.1 34
1922    0.3 235
1923    0.1 2
1924    0.5 5
1925    0.5 23
1926    0.5 235
1927    0.6 23
1928    0.3 4
1929    0.1 234
1930    0.5 2
1931    0.5 5
1932    0.5 2
1933    0.6 6
1934    0.3 4
1935    0.1 36

1 Ответ

2 голосов
/ 12 апреля 2019

Вы можете использовать опцию ggplot sec.axis.

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

library(ggplot2)
library(scales)


prod <- data.frame(year=1910:1935, mean=sample(seq(0.1, 0.6, 0.1), 26, replace = T), soldProd=sample(4:2000, 26))

gg <- ggplot(prod, aes(year, mean)) + geom_smooth(method="glm", formula=y~poly(x,3), se=FALSE, colour ="red") +
  geom_smooth(method = "lm", formula=y~x, se = FALSE, colour = "blue") +
  stat_smooth(method = "lm", colour = "blue") +
  #geom_point() +
  xlab("year of sold") + ylab("Mean[%]") 

gb <- ggplot_build(gg)
y.range <- gb$layout$panel_params[[1]]$y.range
y2.range <- extendrange(range(prod$soldProd), f=0.01)
prod$scaledSoldProd <- rescale(prod$soldProd, y.range, y2.range)
scale_factor <- (diff(y.range)/max(y2.range))
trans <- ~ ((. -y.range[1])/scale_factor)

gg <- gg + geom_line(aes(y=scaledSoldProd))
gg <- gg + scale_y_continuous(breaks = seq(min(prod$mean), max(prod$mean), by = 0.2),
                              sec.axis = sec_axis(trans, name = "Number of products"))

print(gg)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...