r - ggplot2 填充/分组导致不需要的线条在 geom_ribbon 中连接
问题描述
我正在尝试绘制股票价格和上方的一些颜色作为指标。问题是颜色不应该总是存在,这由缺失值表示,但使用geom_ribbon
会导致缺失值出现。代码如下:
library(dplyr)
library(ggplot2)
library(lubridate)
library(padr)
# Does not work correctly
ggplot(x, aes(x = Date, y = Stock)) +
geom_ribbon(data = a, inherit.aes = FALSE, aes(
x = Date2,
ymin = Price * 1.1,
ymax = Price,
y = Price,
fill = Group
), alpha = 0.9) +
geom_line()
# Add missing values as NAs
b <- pad(a)
# Works but does not show colors
ggplot(x, aes(x = Date, y = Stock)) +
geom_ribbon(data = b,
inherit.aes = FALSE,
aes(x = Date2,
ymin = Price * 1.1,
ymax = Price,
y = Price#,
#fill = Group
),
alpha = 0.9) +
geom_line()
# Does not work correctly because of the grouping caused by the fill
ggplot(x, aes(x = Date, y = Stock)) +
geom_ribbon(data = b,
inherit.aes = FALSE,
aes(x = Date2,
ymin = Price * 1.1,
ymax = Price,
y = Price,
fill = Group),
alpha = 0.9) +
geom_line()
它应该看起来像这样,但没有填写缺失值:
用 NA 填充缺失值允许不显示缺失值。只有以下几点上面应该有一条丝带,但似乎不可能给它们着色:
如果色带在填充后着色,则数据会被分组,缺失值会被插值,这不应该是这种情况:
数据:
x <- structure(list(Date = structure(c(18213, 18214, 18215, 18218,
18219, 18220, 18221, 18222, 18225, 18226, 18227, 18229, 18232,
18233, 18234, 18235, 18236, 18239, 18240, 18241, 18242, 18243,
18246, 18247, 18248, 18249, 18250, 18253, 18254, 18256, 18257,
18260, 18261, 18263, 18264, 18267, 18268, 18269, 18270, 18271,
18274, 18275, 18276, 18277, 18278, 18282, 18283, 18284, 18285,
18288, 18289, 18290, 18291, 18292, 18295, 18296, 18297, 18298,
18299, 18302, 18303, 18304, 18305, 18306, 18310, 18311, 18312,
18313, 18316, 18317, 18318, 18319, 18320, 18324, 18325, 18326,
18327, 18328, 18331, 18332, 18333, 18334, 18335, 18338, 18339,
18340, 18341, 18342, 18345, 18346, 18347, 18348, 18349, 18352,
18353, 18354, 18355, 18356, 18359, 18360, 18361, 18362, 18363,
18366, 18367, 18368, 18369, 18373, 18374, 18375, 18376, 18377,
18380, 18381, 18382, 18383, 18384, 18387, 18388, 18389, 18390,
18391, 18394, 18395, 18396, 18397, 18398, 18401, 18402, 18403,
18404, 18405, 18409, 18410, 18411, 18412, 18415, 18416, 18417,
18418, 18419, 18422, 18423, 18424, 18425, 18426, 18429, 18430,
18431, 18432, 18433, 18436, 18437, 18438, 18439, 18440, 18443,
18444, 18445, 18446, 18450, 18451, 18452, 18453, 18454, 18457,
18458, 18459, 18460, 18461, 18464, 18465, 18466, 18467, 18468,
18471, 18472, 18473, 18474, 18475, 18478, 18479, 18480, 18481,
18482, 18485, 18486, 18487, 18488, 18489, 18492, 18493, 18494,
18495, 18496, 18499, 18500, 18501, 18502, 18503, 18507, 18508,
18509, 18510, 18513, 18514, 18515, 18516, 18517, 18520, 18521,
18522, 18523, 18524, 18527, 18528, 18529, 18530, 18531, 18534,
18535, 18536, 18537, 18538, 18541, 18542, 18543, 18544, 18545,
18548, 18549, 18550, 18551, 18552, 18555, 18556, 18557, 18558,
18559, 18562, 18563, 18564, 18565, 18566, 18569, 18570, 18571,
18572, 18573, 18576, 18577, 18578, 18579, 18580, 18583, 18584,
18585, 18586, 18587, 18590, 18591, 18592, 18594, 18597, 18598,
18599, 18600, 18601, 18604, 18605, 18606, 18607, 18608, 18611,
18612, 18613, 18614, 18615, 18618, 18619, 18620, 18622, 18625,
18626, 18627), class = "Date"),
Stock = c(32.302406, 32.783638,
32.753559, 33.084404, 32.723484, 32.377602, 32.663322, 32.994171,
32.422722, 32.332485, 32.106918, 32.00164, 31.445225, 31.294838,
31.249725, 30.738419, 31.580574, 31.881338, 31.941496, 31.460262,
31.370037, 31.430185, 31.685837, 31.730949, 32.531425, 32.305305,
32.320374, 32.893227, 32.817848, 32.516354, 32.697247, 32.531425,
33.013821, 31.883207, 31.702311, 31.084244, 31.219913, 31.129463,
30.963646, 31.536489, 31.023943, 31.38574, 31.476185, 31.219913,
31.250069, 31.280209, 31.415892, 30.692297, 30.119457, 30.07423,
29.938557, 29.305418, 29.606909, 29.395864, 28.265259, 29.124521,
29.471237, 30.05916, 30.104383, 29.938557, 30.330505, 30.360651,
30.119457, 30.360651, 29.998857, 28.958696, 29.486313, 29.712437,
29.727509, 29.245119, 28.732574, 28.476297, 27.767788, 25.627169,
26.727627, 26.622101, 26.079411, 25.883436, 25.868364, 25.20507,
24.858349, 23.652367, 24.662378, 25.551794, 26.667328, 25.868364,
25.159845, 25.597015, 25.597015, 26.652252, 26.652252, 26.727627,
26.546728, 27.828083, 28.024061, 27.767788, 27.390923, 27.481363,
26.893454, 27.044199, 27.285393, 26.953745, 27.225088, 26.365831,
25.627169, 26.184935, 27.601965, 26.652252, 26.411057, 26.395979,
25.702539, 24.978949, 26.184935, 26.124634, 26.139708, 26.139708,
25.732691, 25.883436, 26.380905, 27.737633, 27.782866, 27.586891,
27.933609, 28.325556, 28.702429, 28.370781, 28.642126, 29.395864,
29.682287, 30.013933, 29.727509, 30.044086, 29.410936, 29.471237,
29.712437, 29.214966, 29.426016, 29.772738, 29.848104, 29.953634,
30.345573, 30.436029, 30.541553, 30.782749, 30.390808, 30.601849,
30.194832, 30.209909, 30.963646, 30.707371, 30.586777, 30.888273,
31.491264, 31.226501, 30.954172, 31.075211, 30.606213, 30.454916,
31.271893, 31.302149, 31.196245, 31.211376, 31.710632, 31.150858,
31.105465, 30.863405, 30.575953, 30.969309, 28.89662, 29.501785,
28.836103, 29.123556, 28.972263, 29.093298, 28.639423, 28.20068,
27.610645, 28.351974, 27.882971, 27.928352, 28.125036, 27.232416,
26.521349, 26.808798, 27.550123, 27.958612, 27.746809, 28.246065,
28.397356, 28.291456, 28.881491, 29.138687, 29.108423, 29.516909,
28.972263, 29.486652, 29.380754, 29.229462, 28.321712, 27.686293,
27.338318, 29.00252, 28.715067, 29.380754, 29.00252, 28.730202,
29.032782, 28.20068, 28.185551, 27.535, 27.988873, 27.580385,
27.429092, 27.277803, 26.823933, 27.247543, 27.988873, 27.262672,
27.171898, 26.415443, 26.127991, 25.764894, 25.94644, 25.94644,
26.521349, 25.825409, 26.11286, 25.47744, 25.053823, 25.295889,
25.250502, 25.462311, 24.887403, 25.386665, 25.053823, 25.295889,
24.660463, 24.509178, 24.963047, 24.645338, 25.038694, 24.766371,
25.961571, 25.537954, 25.159723, 25.038694, 24.811756, 23.782978,
24.176332, 24.645338, 24.478916, 24.61508, 23.767849, 23.979656,
23.934263, 24.040173, 24.085558, 24.5243, 24.947918, 25.038694,
24.312494, 23.979656, 22.618032, 22.723938, 21.649773, 22.118773,
21.558996, 21.649773, 20.409182, 20.424313, 19.985567, 18.835754,
18.260849, 16.173027, 16.309193, 18.383097, 17.293257, 19.008156,
19.745405, 19.376781, 19.825541, 20.130056, 18.206802, 19.55308,
18.383097)),
class = "data.frame", row.names = c(NA, -285L))
a <- structure(list(Price = c(16.173027, 16.309193, 25.627169, 26.079411,
25.883436, 25.868364, 25.20507, 24.858349, 23.652367, 24.662378,
25.551794, 25.868364, 25.159845, 25.597015, 25.597015, 26.365831,
25.627169, 26.184935, 26.411057, 26.395979, 25.702539, 24.978949,
26.184935, 26.124634, 26.139708, 26.139708, 25.732691, 25.883436,
26.380905, 26.415443, 26.127991, 25.764894, 25.94644, 25.94644,
25.825409, 26.11286, 25.47744, 25.053823, 25.295889, 25.250502,
25.462311, 24.887403, 25.386665, 25.053823, 25.295889, 24.660463,
24.509178, 24.963047, 24.645338, 25.038694, 24.766371, 25.961571,
25.537954, 25.159723, 25.038694, 24.811756, 23.782978, 24.176332,
24.645338, 24.478916, 24.61508, 23.767849, 23.979656, 23.934263,
24.040173, 24.085558, 24.5243, 24.947918, 25.038694, 24.312494,
23.979656, 22.618032, 22.723938, 21.649773, 22.118773, 21.558996,
21.649773, 20.409182, 20.424313, 19.985567, 18.835754, 18.260849,
18.383097, 17.293257, 19.008156, 19.745405, 19.376781, 19.825541,
20.130056, 18.206802, 19.55308, 18.383097),
Date2 = structure(c(18611,
18612, 18324, 18327, 18328, 18331, 18332, 18333, 18334, 18335,
18338, 18340, 18341, 18342, 18345, 18366, 18367, 18368, 18374,
18375, 18376, 18377, 18380, 18381, 18382, 18383, 18384, 18387,
18388, 18534, 18535, 18536, 18537, 18538, 18542, 18543, 18544,
18545, 18548, 18549, 18550, 18551, 18552, 18555, 18556, 18557,
18558, 18559, 18562, 18563, 18564, 18565, 18566, 18569, 18570,
18571, 18572, 18573, 18576, 18577, 18578, 18579, 18580, 18583,
18584, 18585, 18586, 18587, 18590, 18591, 18592, 18594, 18597,
18598, 18599, 18600, 18601, 18604, 18605, 18606, 18607, 18608,
18613, 18614, 18615, 18618, 18619, 18620, 18622, 18625, 18626,
18627), class = "Date"),
Group = c("b", "b", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a")),
class = "data.frame", row.names = c(NA,
-92L))
解决方案
您可以独立于填充设置组。唯一的缺点是您必须自己计算这些组。您可以使用运行长度编码来做到这一点。
# Calculate Rle
rle <- rle(b$Group)
# Replace non-NA runs with run IDs
rle <- within(unclass(rle), values[!is.na(values)] <- seq_along(values[!is.na(values)]))
# Add Rle to data
b$run <- inverse.rle(rle)
# Discard unecessary data
b <- b[!is.na(b$Group),]
ggplot(x, aes(x = Date, y = Stock)) +
geom_ribbon(data = b, inherit.aes = FALSE, aes(
x = Date2,
ymin = Price * 1.1,
ymax = Price,
y = Price,
fill = Group,
group = run
), alpha = 0.9) +
geom_line()
推荐阅读
- vhdl - 存储在变量内部(if 语句)中的条件评估给出正确的结果,而直接评估(断言)给出错误的结果
- c# - 为 RESTful WCF C# 构造 XML 请求
- c++ - 将 2D 内存分配转换为 1D 矢量的最佳方法
- python - 尝试在 python 中编码文本时出错
- macos - 在 Mac Big Sur (mac osx 10.11) 上为 arm64 构建 avrocpp 库
- javascript - 有没有办法在使用选项卡时在页面加载之前隐藏 JQuery 中的内容?
- c# - 在 Blazor 中显示文本和图像的 QR 码
- reactjs - 即使调用了状态钩子,React 函数也不会重新渲染
- javascript - 如何在 pipe() 之后将 observable 转换为 Promise
- swagger - 如何从 swagger 中查看所有端点?