比例填充手册 - 颜色比例的值映射到不同图上的不同颜色

Scale fill manual - values of the color scale mapped to different colors on different plots

我有一系列数据框如下所示:

> head(df_maxima, 10)
        t distance_max intesity_max  s_n_max
1   4.034       49.706     1979.922 2.251441
2   4.244       49.706     2008.562 2.269629
3   8.068       77.321     2248.527 2.388716
4   8.278       77.321     2255.795 2.389224
5  12.102       99.412     2330.322 2.512899
6  12.312       99.412     2327.884 2.517018
7  16.136      121.504     2348.834 2.541273
8  16.346      121.504     2348.147 2.539562
9  20.170      138.073     2309.776 2.583442
10 20.380      138.073     2307.124 2.579166

> tail(df_maxima, 10)
          t distance_max intesity_max  s_n_max
139 280.653      331.375     1213.470 1.296612
140 280.863      331.375     1218.176 1.310372
141 284.687      331.375     1226.017 1.304955
142 284.897      331.375     1228.822 1.309873
143 288.721      325.852     1233.728 1.338480
144 288.930      325.852     1239.651 1.339542
145 292.754      325.852     1240.988 1.342206
146 292.965      325.852     1243.669 1.347340
147 296.789      325.852     1244.913 1.347174
148 296.999      325.852     1250.809 1.350358

我想绘制我的数据,以便点的填充基于列 s_n_max 中的值。我还希望与 s_n_max 的某些值区间匹配的颜色在不同的数据框和不同的图表中保持一致,以便能够直观地比较图表。这似乎是一个问题,因为 s_n_max 的值在不同的数据帧中可能不同,因此在一个数据帧中 s_n_max 值的范围可以在 1.5 到 2.5 之间,而在另一个数据帧中 s_n_max 可以介于 0.5 和 2 或 5 之间。

我希望将刻度的颜色稳定地分配给 s_n_max 的 4 类 个值(s_n_max < 1, 1<= s_n_max < 1.5, 1,5 <= s_n_max < 2, s_n_max >= 2), 即使某个数据框中的 s_n_max 未命中,也要坚持这种颜色范围的值分配某些值。

目前我使用这段代码生成下图

my_pal_quant_2 <- RColorBrewer::brewer.pal(9, "Blues")

    ggplot()+
    geom_point(data=df_maxima, aes(x=t, y=distance_max, fill=cut(s_n_max, c(0,1,1.5,2,max(s_n_max)))), shape=21, col=my_pal_gray[5], stroke=0.01, size=3.5, alpha=1)+
    xlab("Time [s]") +
    ylab(paste("Distance from the centre", "\n" , "[\U003BCm]"))+
    theme_bw(base_size=18)+
    theme(plot.title = element_text(hjust = 0.5))+
    labs(fill="signal/noise") +
    scale_fill_manual(values =c(my_pal_quant_2[1],my_pal_quant_2[3], my_pal_quant_2[5], my_pal_quant_2[8]))+
   guides(aesthetics = "fill", fill = guide_legend(reverse = TRUE, override.aes = list(shape = 21, size= 10)))

我认为在 scale_fill_manual 中按顺序引入中断并指定颜色会起作用,但正如您在图中看到的那样,较浅的颜色 (my_pal_quant_21) 它没有按我的意愿分配给 s_n_max 值的第一个区间 (s_n_max < 1).

我认为问题是我必须修复比例限制,但是如果我以这种方式在图表代码中指定限制

ggplot()+
geom_point(data=df_maxima, aes(x=t, y=distance_max, fill=cut(s_n_max, c(0,1,1.5,2,max(s_n_max)))), shape=21, col=my_pal_gray[5], stroke=0.01, size=3.5, alpha=1)+
xlab("Time [s]") +
ylab(paste("Distance from the centre", "\n" , "[\U003BCm]"))+
theme_bw(base_size=18)+
theme(plot.title = element_text(hjust = 0.5))+
labs(fill="signal/noise") +
scale_fill_manual(values =c(my_pal_quant_2[1],my_pal_quant_2[3], my_pal_quant_2[5], my_pal_quant_2[8]), limits=c(0,10))+
guides(aesthetics = "fill", fill = guide_legend(reverse = TRUE, override.aes = list(shape = 21, size= 10)))

结果如下图 2 所示 - 点的颜色填充已经消失,并且限制似乎已经覆盖了中断。

知道为什么会这样吗?我该如何解决?

这是我的数据的可重用(我希望)版本

> dput(df_maxima)
structure(list(t = c(4.034, 4.244, 8.068, 8.278, 12.102, 12.312, 
16.136, 16.346, 20.17, 20.38, 24.204, 24.414, 28.238, 28.448, 
32.272, 32.482, 36.306, 36.516, 40.34, 40.55, 44.374, 44.584, 
48.408, 48.618, 52.441, 52.652, 56.476, 56.686, 60.51, 60.72, 
64.544, 64.754, 68.578, 68.788, 72.611, 72.822, 76.645, 76.856, 
80.68, 80.89, 84.714, 84.924, 88.748, 88.958, 92.781, 92.992, 
96.816, 97.026, 98.175, 102, 102.21, 106.034, 106.244, 110.068, 
110.278, 114.102, 114.312, 118.136, 118.346, 122.17, 122.38, 
126.204, 126.414, 130.238, 130.448, 134.272, 134.482, 138.306, 
138.516, 142.34, 142.55, 146.373, 146.584, 150.408, 150.618, 
154.442, 154.652, 158.475, 158.686, 162.51, 162.72, 166.544, 
166.754, 170.578, 170.788, 174.612, 174.821, 178.645, 178.856, 
182.68, 182.89, 186.715, 186.924, 190.749, 190.958, 194.783, 
194.993, 198.817, 199.027, 200.175, 204, 204.21, 208.032, 208.242, 
212.067, 212.277, 216.102, 216.312, 220.135, 220.346, 224.17, 
224.381, 228.205, 228.415, 232.239, 232.449, 236.273, 236.483, 
240.307, 240.519, 244.344, 244.554, 248.378, 248.588, 252.411, 
252.621, 256.447, 256.657, 260.48, 260.691, 264.515, 264.725, 
268.55, 268.76, 272.584, 272.794, 276.618, 276.828, 280.653, 
280.863, 284.687, 284.897, 288.721, 288.93, 292.754, 292.965, 
296.789, 296.999), distance_max = c(49.706, 49.706, 77.321, 77.321, 
99.412, 99.412, 121.504, 121.504, 138.073, 138.073, 154.641, 
154.641, 160.164, 165.687, 176.733, 176.733, 182.256, 182.256, 
198.825, 198.825, 204.348, 204.348, 209.871, 209.871, 220.916, 
220.916, 226.439, 226.439, 231.962, 231.962, 237.485, 237.485, 
243.008, 243.008, 248.531, 248.531, 254.054, 254.054, 259.577, 
259.577, 265.1, 265.1, 265.1, 265.1, 276.146, 276.146, 281.668, 
281.668, 281.668, 287.191, 287.191, 292.714, 292.714, 298.237, 
298.237, 298.237, 298.237, 303.76, 303.76, 303.76, 303.76, 309.283, 
309.283, 314.806, 314.806, 320.329, 320.329, 320.329, 320.329, 
320.329, 320.329, 320.329, 320.329, 314.806, 314.806, 314.806, 
314.806, 314.806, 314.806, 314.806, 314.806, 314.806, 314.806, 
320.329, 320.329, 320.329, 320.329, 320.329, 320.329, 320.329, 
320.329, 320.329, 320.329, 320.329, 320.329, 320.329, 320.329, 
320.329, 320.329, 320.329, 320.329, 320.329, 320.329, 320.329, 
320.329, 320.329, 320.329, 320.329, 320.329, 320.329, 320.329, 
320.329, 320.329, 320.329, 320.329, 320.329, 325.852, 325.852, 
331.375, 325.852, 331.375, 331.375, 331.375, 331.375, 331.375, 
331.375, 336.898, 336.898, 336.898, 336.898, 336.898, 336.898, 
336.898, 336.898, 336.898, 336.898, 336.898, 336.898, 331.375, 
331.375, 331.375, 331.375, 325.852, 325.852, 325.852, 325.852, 
325.852, 325.852), intesity_max = c(1979.92230381636, 2008.56166900881, 
2248.52723179505, 2255.79451634931, 2330.32234953711, 2327.88378516362, 
2348.8343415127, 2348.14680159507, 2309.77579065898, 2307.12423239007, 
2277.66403763103, 2276.1881433748, 2226.63189556725, 2223.04612992737, 
2187.44521152477, 2185.01854317659, 2113.40419145911, 2106.95311432289, 
2019.47872850255, 2014.75513931461, 1970.8748703856, 1967.29978877911, 
1892.83180486698, 1884.08321387381, 1860.28811848347, 1855.7989916887, 
1819.68600120569, 1815.31483959351, 1752.25959566801, 1748.94651654063, 
1707.44631517983, 1701.81874724901, 1672.31610178508, 1675.07262830824, 
1629.35577737165, 1622.95594527249, 1594.73271800544, 1592.26365342627, 
1565.15450424085, 1564.02814029807, 1529.45736225544, 1526.40298637471, 
1485.87646781073, 1482.32587007202, 1452.38332379034, 1454.36364601585, 
1432.32690458437, 1433.58090017712, 1416.20657028369, 1381.5077909554, 
1376.91061677601, 1364.03626066873, 1363.38629589693, 1359.20369261903, 
1361.42177642401, 1356.84766849606, 1355.1820901064, 1348.4887820217, 
1346.09076725648, 1323.16977340783, 1322.27276997107, 1306.4789364913, 
1304.89078683714, 1292.06132553484, 1291.47612962683, 1274.77496623058, 
1276.04234959366, 1271.43272691217, 1272.45637976839, 1264.41961088779, 
1262.66261404286, 1258.4304721833, 1257.08637663008, 1129.51935239079, 
1129.91981422936, 1122.72850546887, 1125.52847921021, 1114.91002191344, 
1112.57041678153, 1102.87212456803, 1103.0139141179, 1092.39671914476, 
1094.48738639713, 1090.77518264334, 1092.24215670475, 1092.36185428102, 
1094.1466007486, 1095.52481154781, 1096.7799517286, 1098.72028552569, 
1100.37722731199, 1100.14404983392, 1101.74967173289, 1098.72888304895, 
1101.63529496167, 1104.32279375354, 1106.09416482097, 1105.30981381202, 
1105.60346635643, 1112.34119682095, 1094.0590377904, 1096.12380055849, 
1094.31126456126, 1099.43669810833, 1109.82141151297, 1113.74550644555, 
1115.34987618966, 1118.59469793335, 1118.50411722512, 1121.03542726029, 
1113.02090147212, 1116.55315296217, 1116.52649565333, 1119.77567158107, 
1124.9297007421, 1128.98942805628, 1132.57644869893, 1138.45514326464, 
1140.14078719406, 1143.18950233488, 1150.2064714797, 1154.24855514644, 
1158.30088658969, 1162.97171227054, 1163.47885128066, 1168.31102965649, 
1169.73067354679, 1174.56368305098, 1174.84712548331, 1178.56944753478, 
1173.96461080875, 1178.97433433504, 1180.86639684943, 1185.49285459939, 
1195.04680018485, 1199.61087517408, 1206.40514550419, 1208.54362602938, 
1213.46993848896, 1218.17568229377, 1226.01745918658, 1228.82153926183, 
1233.72771711532, 1239.65120994883, 1240.98800664377, 1243.6691625855, 
1244.91314782737, 1250.80863046917), s_n_max = c(2.25144148537218, 
2.26962887230276, 2.38871589544491, 2.38922391175673, 2.51289889125301, 
2.5170179020928, 2.5412726374042, 2.53956231724249, 2.58344241539977, 
2.57916599135521, 2.42254325331079, 2.42816796633502, 2.37220684712286, 
2.40814651195294, 2.38006310500208, 2.37934846653566, 2.31890961006215, 
2.31608616128134, 2.26693619609292, 2.25612224153314, 2.0931881891597, 
2.09778079349956, 2.04645183980855, 2.03330490556759, 2.07703705705985, 
2.07014084276515, 2.00439268600544, 2.0013108262749, 1.93265951204332, 
1.93027690765212, 1.85367117349408, 1.84744199845415, 1.80213581085882, 
1.80267095818825, 1.79820713290254, 1.7910497892261, 1.73323861178584, 
1.72934330125006, 1.66232486917941, 1.66103765430581, 1.62892610676827, 
1.62460389580007, 1.58359519743233, 1.57663763185811, 1.59280956262804, 
1.59605224692903, 1.57513185505005, 1.57092109979469, 1.55201236893203, 
1.48736244804815, 1.48206570585183, 1.47833613438516, 1.4805189393531, 
1.49764205481733, 1.50533350109248, 1.49439604443481, 1.49045472310451, 
1.48702165261742, 1.48054230720796, 1.45413011763978, 1.45208336219909, 
1.43340417360416, 1.42969476117652, 1.4165296294318, 1.41088732655332, 
1.40026099710555, 1.39815883895423, 1.38917223571977, 1.39194103868671, 
1.37472546455223, 1.37955200329312, 1.36530070337863, 1.35742463825747, 
1.30031621280637, 1.30070123872516, 1.27445331707465, 1.2742742097163, 
1.24602906139047, 1.24817213460883, 1.22416583200257, 1.22489897712777, 
1.20550590696318, 1.20201181567261, 1.2273211640213, 1.22959755767437, 
1.22098561833547, 1.22306831038143, 1.2155481359841, 1.22077186429451, 
1.21416022186004, 1.21403825487672, 1.20445566473816, 1.20763840494796, 
1.19876531490627, 1.20279973453789, 1.20202981062653, 1.19847842971369, 
1.20046173375287, 1.19790682341363, 1.20114073410853, 1.18165803031087, 
1.1815533546873, 1.1803104555859, 1.18732518285618, 1.19454698002281, 
1.20073805437238, 1.20215081816326, 1.20169452668347, 1.201164773576, 
1.20537821528183, 1.20414555027744, 1.2082695928816, 1.20539379029823, 
1.20846070398292, 1.21463967864487, 1.22005674610479, 1.22609538571136, 
1.23340567583566, 1.22406225441233, 1.23818075625747, 1.23378181088266, 
1.23695367736438, 1.24586694689738, 1.2453508392526, 1.25057586814617, 
1.25490794009328, 1.24031510917234, 1.24841997032498, 1.25355962979258, 
1.25341734386246, 1.24963712427607, 1.25490871831107, 1.2587833687635, 
1.26083720278796, 1.27207911317142, 1.27470951063669, 1.28279376500857, 
1.2863610194323, 1.29661211997708, 1.31037230050035, 1.30495528634301, 
1.30987283392375, 1.33848020532095, 1.3395424299679, 1.34220559786466, 
1.34734031085204, 1.34717399611496, 1.35035801558689)), .Names = c("t", 
"distance_max", "intesity_max", "s_n_max"), row.names = c(NA, 
-148L), class = "data.frame")
> 

这里一个可能的解决方案是在 ggplot2 之外生成 4 个组,并在 scale_fill_manual 函数的 breaks 参数中传递它们的级别:

library(dplyr)

DF <- df_maxima %>% 
  mutate(Group = cut(s_n_max, breaks = c(0,1,1.5,2, Inf), include.lowest = TRUE)) 

library(ggplot2)

ggplot(DF, 
       aes(x = t, y = distance_max,
           fill = Group))+
  geom_point(color = my_pal_quant_2[5], stroke = 0.01, shape = 21, size = 3.5, alpha = 1)+
  scale_fill_manual(breaks = levels(DF$Group), drop = FALSE,
                      values = my_pal_quant_2[c(1,3,5,8)])+
  guides(fill = guide_legend(reverse = TRUE))

它是否符合您的功能?