从具有不同 y 间隔的两个数据集中绘制两个时间序列

Plot two time series from two data sets with different y-intervals

我有以下数据:

dat1<-structure(list(Height = c(614L, 672L, 789L, 1086L, 1252L, 1342L, 
1523L, 2141L, 2316L, 2426L, 2549L, 2788L, 2858L, 3080L, 3175L, 
3223L, 3880L, 3983L, 4166L, 4285L, 4339L, 4365L, 4488L, 4625L, 
4723L, 4765L, 5525L, 5570L, 5910L, 5941L, 5957L, 6196L, 6359L, 
6425L, 6475L, 6745L, 7079L, 7480L, 7630L, 7782L, 7898L, 7996L, 
8314L, 8520L, 8688L, 8709L, 8794L, 8880L, 9055L, 9099L, 9210L, 
9323L, 9740L, 9883L, 9956L, 10227L, 10302L, 10429L, 11010L, 11370L, 
11996L, 12087L, 12500L, 12565L, 12825L, 13167L, 13418L, 13525L, 
13859L, 14053L, 14210L, 14290L, 14660L, 14789L, 15002L, 15314L, 
16044L, 16420L, 16584L, 16640L, 17049L, 17491L, 17829L, 17991L, 
18117L, 18131L, 18506L, 18670L, 18841L, 19582L, 19885L, 20086L, 
20319L, 20670L, 21044L, 21109L, 21449L, 21519L, 21739L, 21906L, 
22046L, 22125L), Temp = c(25.6, 24.4, 23.4, 20.2, 21, 20.5, 19.4, 
17.2, 16.8, 16.1, 15.4, 13.4, 13.4, 11.6, 11.6, 11.4, 6.8, 6.4, 
5.4, 5.2, 4.8, 4.8, 4.8, 4.4, 3.8, 4, -2.1, -2.5, -5.9, -6.3, 
-6.4, -8.1, -8.2, -8.3, -7.9, -9.9, -12.3, -13.3, -14.7, -15.7, 
-16.4, -16.9, -19.6, -21.3, -22, -22.1, -22.5, -23.3, -24.1, 
-24.5, -25.5, -26.3, -29.7, -30.8, -31.3, -33.9, -34.4, -35.1, 
-39.9, -42.9, -48.1, -48.9, -52.7, -53.3, -55.3, -58, -59.9, 
-60.9, -63.8, -65.5, -66.6, -67.1, -70.5, -71.7, -73.1, -75, 
-79.7, -82.1, -81.9, -81.9, -81.3, -80.6, -80.1, -79.9, -76.7, 
-76.3, -74.8, -74.1, -73.2, -69.5, -67.9, -66.9, -67, -67.1, 
-66.4, -66.3, -60.7, -59.5, -58.6, -57.9, -58.9, -59.5)), class = "data.frame", row.names =     
c(NA,-102L))

dat2<-structure(list(Height = c(614L, 651L, 776L, 957L, 1093L, 1152L, 
1362L, 1514L, 1575L, 1875L, 2186L, 2531L, 2632L, 3168L, 3618L, 
3834L, 4170L, 4396L, 4451L, 4573L, 4893L, 5372L, 5461L, 5704L, 
5890L, 5906L, 5953L, 5985L, 6033L, 6081L, 6178L, 6210L, 6309L, 
6801L, 6924L, 7120L, 7174L, 7506L, 7563L, 7620L, 7832L, 7929L, 
8309L, 8774L, 9035L, 9329L, 9726L, 9750L, 10312L, 11020L, 11645L, 
11851L, 12510L, 12573L, 12897L, 13239L, 13564L, 13906L, 14310L, 
14632L, 14973L, 15671L, 15923L, 15973L, 16338L, 16613L, 16670L, 
17016L, 17385L, 17462L, 17539L, 17712L, 18062L, 18670L, 18753L, 
19189L, 19308L, 19570L, 19721L, 19877L, 20317L, 20432L, 20670L, 
21049L, 21412L, 21453L, 21739L, 22147L, 22194L, 22241L, 22982L, 
23037L, 23373L, 23393L), Temp = c(24.2, 24, 23.6, 22.3, 21.4, 
22.8, 22.8, 21.4, 21, 18.8, 16.5, 14, 14.4, 11.2, 8.9, 7.8, 5.6, 
3.8, 3.4, 2.6, 0.8, -2.5, -2.9, -4.7, -5.5, -5.5, -5.7, -5.9, 
-6.1, -5.3, -5.9, -5.5, -5.5, -9.3, -9.3, -10.4, -10.7, -12.6, 
-12.9, -13.5, -15.1, -15.9, -18.8, -22.5, -23.9, -25.5, -28.7, 
-28.9, -33.7, -39.3, -43.7, -45.6, -51.5, -52, -54.8, -57.7, 
-60.5, -63.5, -66.9, -69.4, -72, -77.4, -79.3, -79.3, -79.2, 
-79.1, -79.5, -81.1, -82.8, -83.1, -83.1, -82.2, -80.5, -77.5, 
-77, -74.6, -73.9, -69.8, -67.5, -67.5, -67.3, -67.3, -65.7, 
-63.8, -61.9, -62.1, -63.3, -65.1, -63.9, -62.7, -63.9, -63.3, 
-59.7, -59.5)), class = "data.frame", row.names = c(NA, -94L))

这两个数据集有两列高度(以米为单位)和温度(以摄氏度为单位)。

我想用 R 绘制这两个数据集(高度作为 y 轴,温度作为 x 轴)。

我的问题是它们的高度间隔不相等。

  1. 是否可以为两个数据集创建一个公共区间?例如,从 0 到 80 公里,间隔 10 公里。

  2. 从(1)中的区间,得到每个区间的平均温度。

  3. 绘制两个数据集的高度(y 轴)与温度(x 轴)图。

目前,我在 Excel 中手动执行此操作,包括求平均值。

您基本上已经使用 1、2 和 3“编码”了您的方法。

我将两个数据集合并为一个,并向其中添加了一个系列 ID。您可以根据您的 task/sample 尺寸将其分开。
cut() 允许您为间隔定义休息时间。由于样本数据范围 <= 30000,我将中断定义为间隔为 5000 米的序列 seq()。根据需要进行调整以满足您的要求。

library(dplyr)

dat1 <- dat1 %>% mutate(set = "1")    # label as character to make it discrete for ggplot
dat2 <- dat2 %>% mutate(set = "2")
dat  <- bind_rows(dat1, dat2)         # combine all measurements

dat_bin <- dat %>%
#------------- bin height in intervals -------------------------
   mutate(Height_bin = cut(Height, breaks = seq(from = 0, to = 30000, by = 5000))) %>%
#------------- group by set and height bin and calculate mean temparature per group
   group_by(set, Height_bin) %>% 
   summarise(Mean_temp = mean(Temp), .groups = "drop")

这给了你

# A tibble: 10 x 3
   set   Height_bin      Mean_temp
   <chr> <fct>               <dbl>
 1 1     (0,5e+03]            12.8
 2 1     (5e+03,1e+04]       -16.5
 3 1     (1e+04,1.5e+04]     -54.1
 4 1     (1.5e+04,2e+04]     -76.9
 5 1     (2e+04,2.5e+04]     -62.6

您现在可以绘制 bin 和平均温度值,并使用颜色来区分不同的集合。

dat %>%
ggplot() + 
   geom_point(aes(x = Mean_temp, y = Height_bin, colour = set)) + 
  theme_minimal()

当然,你可以根据自己的喜好“美化”剧情。对于“更好”的中断标签,您可以将 labels 参数与 cut() 调用一起使用。

您可以绑定两个数据集并绘制它们。为了制作间隔,我们可以使用 Hmisc::cut2。为了获得统计上更稳健的结果,我定义了每组中的最小观察数 (m),而不是对切点进行硬编码。我还显示了每个间隔的平均值而不是间隔。我将实际间隔显示为标签。

如果您想使用硬编码间隔,可以参考其他答案并通过比较来改进这两个答案。

library(ggplot2)
library(dplyr)
library(Hmisc)
library(ggrepel)


dat1 %>% 
  bind_rows(dat2, .id = "Dataset") %>% 
  mutate(`Height Interval Average` = 
            as.numeric(as.character((cut2(Height, m = 20, levels.mean = T)))),
         `Height Intervals` = as.character((cut2(Height, m = 20)))) %>% 
  group_by(Dataset, `Height Interval Average`) %>% 
  summarise(`Average Temperature` = mean(Temp, na.rm = T),
            `Height Intervals` = first(`Height Intervals`),
            .groups = "drop") -> dat

 ggplot(data = dat,
        aes(x=`Average Temperature`, y=`Height Interval Average`, 
            group = Dataset, color = Dataset)) +
  geom_line() + 
  geom_point() + 
  geom_text_repel(data = dat %>%  filter(Dataset ==1),
                  aes(x=`Average Temperature`, y=`Height Interval Average`, group = 1,
                      label = `Height Intervals`), show.legend = F, color = "black")