Saya perlu memplot dua set data pada satu gambar, menggunakan dua sumbu y. Saya mengalami kesulitan mendapatkan transformasi label data/sumbu yang benar pada sumbu y kedua.

Sebuah contoh:

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

# example data
df <- structure(list(x = c(25, 30, 31, 32, 33, 34, 35, 36.5, 38, 40, 
42, 44, 46, 51, 53, 55, 58, 60, 62, 66, 69.5, 73.5, 80.5, 88, 
97), y = c(25L, 6L, 8L, 1L, 1L, 0L, 4L, 0L, 2L, 4L, 1L, 1L, 11L, 
0L, 0L, 6L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L), y2 = c(281.8, 
283.4, 284.8, 286.3, 288, 289.8, 291.7, 294.4, 296.9, 299.6, 
301.8, 303.8, 305, 305.7, 305.1, 304.3, 302.2, 300.5, 298.8, 
295.1, 292.4, 289.6, 286, 283.6, 281.9)), row.names = c(NA, -25L
), class = "data.frame")

# transform data to be plotted on the second y-axis 
df$y2_trans <- rescale(df$y2, to = c(min(df$y), max(df$y)))

# plot 
ggplot (data = df, aes(x = x)) +
  geom_point(aes(x, y)) +
  geom_line(aes(x = x, y = y2_trans), color = "red") +
  geom_point(aes(x = x, y = y2_trans), color = "red") +
  scale_y_continuous(sec.axis = sec_axis(~rescale(., to = c(min(df$y2), max(df$y2)))))

enter image description here

Secara dangkal ini terlihat bagus, tetapi setelah diperiksa dengan cermat titik dan garis merah, tidak cukup cocok di mana seharusnya pada sumbu y kedua mis.

df[14,]
    x y    y2 y2_trans
14 51 0 305.7       25

Titik tertinggi pada kurva seharusnya berada di 305,7 pada sumbu y kedua, tetapi hanya di bawah 305. Saya dapat melihat ini masalah yang berkaitan dengan penggunaan scales::rescale saya tetapi saya tidak tahu cara memperbaikinya . Setiap saran sangat dihargai.

0
flee 13 Mei 2021, 02:19

1 menjawab

Jawaban Terbaik

Saya menduga masalahnya ada hubungannya dengan bagaimana bantalan skala diterapkan pada dua skala. Saya tidak memahami cara kerjanya dengan cukup baik untuk mengetahui apakah itu bug, disengaja, atau tidak dapat dihindari. Itu bisa diselesaikan dengan membuat hubungan eksplisit.

df$y2_trans <- (df$y2 - 280) * 1.0   # 1.0 included here and below in case you want to adjust

# plot 
ggplot (data = df, aes(x = x)) +
  geom_point(aes(x, y)) +
  geom_line(aes(x = x, y = y2_trans), color = "red") +
  geom_point(aes(x = x, y = y2_trans), color = "red") +
  scale_y_continuous(sec.axis = sec_axis(~ (. / 1.0) + 280, 
                                         breaks = 280 + 5*(0:5)),
                     breaks = 5*(0:5))

enter image description here

1
Jon Spring 13 Mei 2021, 01:05