Как правильно установить диапазон для второй шкалы y в ggplot2? - PullRequest
1 голос
/ 18 октября 2019

Я нашел несколько тем, содержащих sec.axis в scale_y_continuous. Я видел много формул для преобразования второй шкалы. Но мне не нужны trans=~./50 или trans=~.+50. Я бы предпочел установить диапазон мануэля. Я не вижу причины, по которой мне следует связывать вторую шкалу по формуле с первой. Это не зависит от этого.

# data generation
x = seq(1:20)
y1 = runif(20, 5, 50000)
y2 = rnorm(20)
df1 = data.frame(x, y1)
df2 = data.frame(x, y2)

ggplot(data=df1, aes(x, y=y1, col="red")) +
  geom_line() +
  geom_point(data=df2, aes(x, y=y2, col="blue")) +
  scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
  scale_y_continuous(breaks = scales::pretty_breaks(n = 10), sec.axis = sec_axis(trans=~., name="y2")) + 
  theme(legend.position="none")

enter image description here

Когда я запускаю одноточечную команду, она дает «естественную» шкалу.

ggplot() +
  geom_point(data=df2, aes(x, y=y2)) 

enter image description here

Как я могу получить нормальную шкалу y из второго изображения в качестве второй шкалы y с правой стороны первого графика?

Insight:Невозможно не связать две оси Y.

ggplot(data=df1, aes(x, y=y1, col="red")) +
  geom_line() +
  geom_point(data=df2, aes(x, y=y2, col="blue")) +
  scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
  scale_y_continuous(breaks = scales::pretty_breaks(n = 10), sec.axis = sec_axis(trans=~./50000, name="y2")) + 
  theme(legend.position="none")

enter image description here

Тем не менее: Почему точки данных не совпадают влиния с преобразованной второй осью Y?

1 Ответ

1 голос
/ 18 октября 2019

Я думаю, вам все еще нужно разобраться:

ggplot(data=df1, aes(x, y=y1, col="red")) +
  geom_line() +
  geom_point(data=df2, aes(x, y=(2.5+y2)*8000, col="blue")) +
  scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
  scale_y_continuous(breaks = scales::pretty_breaks(n = 10), 
                     sec.axis = sec_axis(trans=~(./8000 - 2.5), name="y2")) + 
  theme(legend.position="none")

enter image description here

...