For a dummy dataset df,
df <- structure(list(date = c("2021-07-31", "2021-08-31", "2021-09-30",
"2021-10-31", "2021-11-30", "2021-12-31", "2022-01-31", "2022-02-28",
"2022-03-31", "2022-04-30", "2022-05-31"), PMI = c(52.4, 48.9,
51.7, 50.8, 52.2, 52.2, 51, 51.2, 48.8, 62.7, 48.4), Exchange_rate = c(5.1,
5.1, 4.9, 4.9, 5, 5.1, 5.3, 5.5, 5.8, 6.1, 5.9), BCI = c(54.6,
50, 54.5, 51.6, 49.2, 45.1, 52.6, 53.8, 51.3, 40.8, 37.3)), class = "data.frame", row.names = c(NA,
-11L))
Out:
date PMI Exchange_rate BCI
1 2021-07-31 52.4 5.1 54.6
2 2021-08-31 48.9 5.1 50.0
3 2021-09-30 51.7 4.9 54.5
4 2021-10-31 50.8 4.9 51.6
5 2021-11-30 52.2 5.0 49.2
6 2021-12-31 52.2 5.1 45.1
7 2022-01-31 51.0 5.3 52.6
8 2022-02-28 51.2 5.5 53.8
9 2022-03-31 48.8 5.8 51.3
10 2022-04-30 62.7 6.1 40.8
11 2022-05-31 48.4 5.9 37.3
I'm trying to plot a time series plot with dual y axis, I set Exchange_rate to the left axis and PMI and BCI to the right axis. To achieve this, I need to get the max and min of Exchange_rate, the max and min of all values of PMI and BCI. At the same time, subtract and add an appropriate value to these minimum and maximum values, respectively, so that all values are included in the final plot.
Using print(skimr::skim(df)), I print out:
-- Variable type: numeric -----------------------------------------------------------------------------------------------
skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
1 PMI 0 1 51.8 3.88 48.4 49.8 51.2 52.2 62.7 ▇▅▁▁▁
2 Exchange_rate 0 1 5.34 0.425 4.9 5.05 5.1 5.65 6.1 ▇▁▁▁▂
3 BCI 0 1 49.2 5.74 37.3 47.2 51.3 53.2 54.6 ▁▁▁▂▇
As you can see, p0 and p100 in the result are the minimum and maximum values of each column, respectively. For the left axis, I need to get approximately c(4.5, 6.5) as the upper and lower limits of the value, and for the right axis, I need to get approximately c(37, 63) as the upper and lower limits of the value,
My expected results are as follows (not need to be exactly the same as the maximum and minimum values below):
left_y_axis_limit <- c(4.5, 6.5)
right_y_axis_limit <- c(37, 63)
Suppose we will have other data with a new range of values, given the column names that will be displayed on the left and right axes, how could we deal with this problem in an adaptive way? Thanks.

