如何在ggplot2中反转二级continuous_y_axis

How to reverse secondary continuous_y_axis in ggplot2

我有一个数据集,我想用两个 Y 轴绘制图表。想要反转次要 Y 轴,使其 运行s -60 到 -40。主要 Y 轴应 运行 300-550。我不知道如何在不反转主 Y 轴的情况下反转辅助 Y 轴。现在副 Y 轴是我想要的,但主 Y 轴不正确。

如有任何帮助,我们将不胜感激!

graph

我的数据集

X    y1     y2
1   394 -45.65
1   377 -45.62
1   377 -45.72
6   342 -46.38
6   375 -46.35
6   408 -46.47
11  336 -47.22
11  349 -47.18
11  376 -47.31
16  397 -48.15
16  397 -48.1
16  397 -48.25
21  395 -49.15
21  406 -49.1
21  417 -49.25
26  390 -50.2
26  418 -50.15
26  446 -50.31
31  427 -51.28
31  438 -51.23
31  337 -51.4
36  427 -52.38
36  438 -52.33
36  337 -52.5
41  342 -53.47
41  377 -53.42
41  376 -53.58
46  372 -54.54
46  387 -54.49
46  415 -54.64
51  360 -55.55
51  376 -55.51
51  442 -55.65
56  308 -56.5
56  424 -56.45
56  459 -56.59
61  395 -57.35
61  356 -57.31
61  436 -57.43
66  436 -58.1
66  370 -58.07
66  412 -58.17
71  488 -58.73
71  527 -58.71
71  489 -58.79
76  396 -59.24
76  379 -59.22
76  410 -59.28
81  372 -59.62
81  477 -59.6
81  478 -59.64
86  507 -59.87
86  445 -59.86
86  427 -59.88
91  414 -59.99
91  427 -59.99
91  436 -60
96  415 -60.01
96  396 -60.01
96  440 -60
101 415 -59.93
101 371 -59.94
101 467 -59.92
106 478 -59.78
106 433 -59.79
106 415 -59.75
111 453 -59.56
111 381 -59.57
111 414 -59.53
116 406 -59.31
116 376 -59.32
116 366 -59.28
121 398 -59.04
121 380 -59.05
121 463 -59.01
126 536 -58.77
126 327 -58.78
126 396 -58.74
131 397 -58.52
131 381 -58.53
131 505 -58.49
136 367 -58.3
136 442 -58.31
136 400 -58.27
141 515 -58.12
141 385 -58.13
141 346 -58.1
146 368 -58
146 343 -58
146 338 -57.99
151 357 -57.94
151 338 -57.94
151 338 -57.94
156 407 -57.94
156 382 -57.94
156 352 -57.95
161 350 -58.01
161 336 -58.01
161 374 -58.02
166 372 -58.15
166 355 -58.14
166 342 -58.16
171 392 -58.35
171 332 -58.33
171 311 -58.37
176 358 -58.6
176 365 -58.58
176 391 -58.63
181 338 -58.9
181 369 -58.88
181 414 -58.93
186 340 -59.22
186 405 -59.2
186 350 -59.26
191 369 -59.57
191 410 -59.55
191 393 -59.61
196 416 -59.92
196 394 -59.9
196 377 -59.95
201 342 -60.25
201 375 -60.23
201 336 -60.28
206 349 -60.55
206 376 -60.52
206 397 -60.57
211 367 -60.78
211 395 -60.76
211 406 -60.8
216 390 -60.93
216 418 -60.92
216 427 -60.94
221 438 -60.99
221 337 -60.99
221 342 -60.99
226 377 -60.94
226 376 -60.94
226 372 -60.92
231 387 -60.76
231 415 -60.76
231 360 -60.73
236 376 -60.44
236 442 -60.45
236 308 -60.4
241 424 -59.99
241 459 -60.01
241 395 -59.93
246 356 -59.4
246 436 -59.43
246 436 -59.33
251 370 -58.68
251 412 -58.72
251 488 -58.6
256 527 -57.85
256 489 -57.89
256 394 -57.75
261 377 -56.92
261 342 -56.96
261 375 -56.81
266 336 -55.9
266 349 -55.94
266 376 -55.79
271 397 -54.82
271 367 -54.87
271 395 -54.7
276 406 -53.7
276 390 -53.75
276 418 -53.58
281 427 -52.56
281 438 -52.61
281 337 -52.44
286 342 -51.42
286 377 -51.47
286 376 -51.3
291 372 -50.3
291 387 -50.35
291 415 -50.18
296 360 -49.22
296 376 -49.27
296 442 -49.11
301 308 -48.2
301 424 -48.25
301 459 -48.1
306 395 -47.26
306 356 -47.3
306 436 -47.17
311 436 -46.41
311 370 -46.45
311 412 -46.33
316 488 -45.67
316 527 -45.7
316 489 -45.6
321 394 -45.04
321 377 -45.07
321 342 -44.98
326 375 -44.54
326 336 -44.56
326 349 -44.5
331 376 -44.18
331 397 -44.19
331 367 -44.15
336 395 -43.96
336 406 -43.96
336 390 -43.94
341 418 -43.88
341 427 -43.88
341 438 -43.88
346 337 -43.95
346 342 -43.94
346 377 -43.96
351 376 -44.16
351 372 -44.15
351 387 -44.19
356 415 -44.52
356 360 -44.49
356 376 -44.56
361 442 -45
361 308 -44.97
361 424 -45.06
366 459 -45.58

我的代码

ggplot() +
  geom_point(data = df, aes(x = X, y = y1),
             size = 3, shape = 2, colour = "black") +
  stat_smooth(data = df, aes(x = X, y = y1),
              method = lm, se = TRUE, fill = NA,
              formula = y ~ poly(x, 3, raw = TRUE),
              colour = "black", linetype = "longdash") +
  geom_line(data = df, aes(x = X, y = y2 * (-8)),
            colour = "magenta3", size = 1) +
  scale_y_continuous(sec.axis = sec_axis(~./8, name = "y2 \n"),
                     trans = 'reverse')

假设图表本身没问题,您只希望 y 轴标签在一侧从 300 到 550,在另一侧从 -60 到 -40,您正在寻找一对一的函数从第一组值映射到另一组值。由于两者(我假设)都在增加,因此不需要 rev()

我对线性回归系数公式的掌握很生疏,但下面应该给出线性变换的正确值:

> lm(y ~ x, data = data.frame(x = c(300, 550), y = c(-60, -40)))

Call:
lm(formula = y ~ x, data = data.frame(x = c(300, 550), y = c(-60, 
    -40)))

Coefficients:
(Intercept)            x  
     -84.00         0.08 

将这些值插入到次要 y 轴的转换中:

ggplot(data = df, aes(x = X, y = y1)) + 
  geom_point(size = 3, shape = 2, colour = "black") + 
  stat_smooth(method = lm, se = TRUE, fill = NA, 
              formula = y ~ poly(x, 3, raw = TRUE), 
              colour = "black", linetype = "longdash") +
  geom_line(aes(y = y2*(-8)), colour = "magenta3", size=1) +
  scale_y_continuous(limits = c(300, 550),
                     sec.axis = sec_axis(trans = ~ -84 + 0.08 * ., 
                                         name = "y2"))

您可以对坐标 (-60,300) 和 (-40,550) 应用线性变换,得到一个函数 f(x) = 12.5*x + 1050

f(-60) = 12.5*-60 + 1050 = 550

f(-40) = 12.5*-40 + 1050 = 300

代码为:

ggplot() +
  geom_point(data = df, aes(x = X, y = y1),
             size = 3, shape = 2, colour = "black") +
  stat_smooth(data = df, aes(x = X, y = y1),
              method = lm, se = TRUE, fill = NA,
              formula = y ~ poly(x, 3, raw = TRUE),
              colour = "black", linetype = "longdash") +
  geom_line(data = df, aes(x = X, y = y2 * 12.5 + 1050),
            colour = "magenta3", size = 1) +
  scale_y_continuous(breaks = seq(300,550,by = 50),
                     sec.axis = sec_axis(~(.-1050)/12.5, name = "y2 \n",
                                         breaks = seq(-60,-40,by = 4))
  )