用单独的线型在 ggplot2 中绘制缺失值
Posted
技术标签:
【中文标题】用单独的线型在 ggplot2 中绘制缺失值【英文标题】:Plotting missing values in ggplot2 with a separate line type 【发布时间】:2019-11-07 19:51:39 【问题描述】:我正在使用 ggplot2 创建一个线图,但我缺少用 NaN 表示的数据。我的线图目前没有在缺失值之间添加任何线。但是,我想用虚线连接丢失的数据,而所有已知数据都用实线连接。
这是我当前绘图的代码,其中包含我的数据框的一小部分和下面的绘图图像。
#make ggplots for all data sets
Q4_plot <- ggplot(data = Q4, mapping = aes(x = Year, y = Q4)) +
geom_line() +
geom_point() +
labs(title = "Quarter 4 Anamolies of C. finmarchicus Population") +
ylab("Anamoly") +
scale_y_discrete(lim = c(-1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5))
#subset of data frame
> dput(Q4)
structure(list(Year = c(1980, 1981, 1982, 1983, 1984, 1985, 1986,
1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017), Q4 = c(-0.2902210281654,
-0.4349222339894, 0.6085474376776, 0.8492088796228, 0.5017554154123,
0.4848742371842, 0.483138540113, 1.134146387603, 1.095609559681,
0.8630386289353, 0.1163274274306, -0.3398165357991, -0.1474840957078,
-1.344090916262, 0.3518846850911, -0.03353853195848, -0.07481708144361,
0.2717396470301, -1.43888104698, -0.4838212547847, -0.8460008644647,
1.061274634085, 0.1433575405896, 0.6949323748611, 0.4219329126636,
-0.1924723455514, -0.2699464637352, NaN, 0.4931694954279, 0.7079867355531,
-0.243929992349, 0.9881050229247, -0.2275292445512, NaN, 0.3237764596434,
-0.3144133941847, 0.6111879054247, NaN)), row.names = c(NA, -38L
), class = c("tbl_df", "tbl", "data.frame"))
这就是我的情节现在的样子,我想在实线不相交的区域添加一条虚线。
如果这个问题或措辞不当,我深表歉意,我是 R 的新用户。
【问题讨论】:
能否请您包含一部分 yearly_average_anamolies 数据框?您可以使用dput
函数。 dput(yearly_average_anamolies)
然后将其粘贴到您的问题中。
【参考方案1】:
为什么不 (1) 删除 NA,然后 (2) 绘制第二条虚线。虚线将在第一个“下方”,因此只会看到有间隙的虚线。
df %>%
ggplot(aes(x = year, y = anomaly)) +
geom_point() +
geom_line() +
geom_line(data = filter(df, is.na(Annual)==FALSE), linetype = "dashed")
【讨论】:
【参考方案2】:这是一个自动化解决方案,它依赖于识别缺失数据两侧的点并将这些点输入到单独的geom_line
。
gaps <- my_data %>%
filter(is.na(lead(Annual)) & row_number() != n() |
is.na(lag(Annual)) & row_number() != 1) %>%
# This is needed to make a separate group for each pair of points.
# I expect it will break if a point ever has NA's on both sides...
# Anyone have a better idea?
mutate(group = cumsum(row_number() %% 2))
ggplot(data = my_data, mapping = aes(x = Year, y = Annual)) +
geom_line() +
geom_line(data = gaps, aes(group = group), linetype = "dashed") +
geom_point() +
labs(title = "Annual Anomalies of C. finmarchicus Population")
假数据:
set.seed(0)
my_data = data.frame(Year = 2000:2019,
Annual = sample(c(-5:5, NA_integer_), 10))
【讨论】:
# 这需要为每对点创建一个单独的组。 # 如果一个点两边都有 NA,我希望它会中断... # 有人有更好的主意吗?如果连续 >1 NA,它确实会中断。我添加了一行代码,确定是否连续有多个 NA,然后只保留第一个。mutate(keep=ifelse(is.na(Annual)&lag(is.na(Annual)==TRUE),"del","keep")) %>%filter(keep=="keep")
【参考方案3】:
这其实比较复杂。这是一种方法:
library(tidyverse)
df <-
tibble(
year = 2000:2009,
anomaly = c(1, 1.5, NaN, 0.5, 0.5, 1, 1, NaN, 1.5, 1.5)
) %>%
mutate(
section1 = if_else(year < 2002, TRUE, FALSE),
section2 = if_else(year %in% c(2001, 2003), TRUE, FALSE),
section3 = if_else(year %in% 2003:2006, TRUE, FALSE),
section4 = if_else(year %in% c(2006, 2008), TRUE, FALSE),
section5 = if_else(year > 2007, TRUE, FALSE)
) %>%
filter(!is.na(anomaly))
df %>%
ggplot(aes(x = year, y = anomaly)) +
geom_point() +
geom_line(data = df %>% filter(section1 == TRUE)) +
geom_line(data = df %>% filter(section2 == TRUE), linetype = 3) +
geom_line(data = df %>% filter(section3 == TRUE)) +
geom_line(data = df %>% filter(section4 == TRUE), linetype = 3) +
geom_line(data = df %>% filter(section5 == TRUE))
这将数据集分为五组,虚线和非虚线的起点和终点重叠。我还删除了 NaN
条目以阻止 ggplot 发出警告。
【讨论】:
以上是关于用单独的线型在 ggplot2 中绘制缺失值的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化:使用pracma包的interp1函数对缺失值进行线性插值后进行可视化分析用虚线标记进行数据填充的区域
R语言ggplot2可视化:计算dataframe中每个数据列缺失值的个数使用堆叠的条形图(Stacked Barplot)可视化每个数据列的缺失值的情况(设置坐标轴为百分比以显示缺失值的比例)
R语言ggplot2可视化线图(line plot):当数据有中断缺失时R不会将数据绘制为连续的线图而是出现断点
R语言ggplot2可视化:使用堆叠的条形图(Stacked Barplot)可视化每个数据行(row)的缺失值的情况(Visualizing missing data counts in rows)