当数据中不存在分组变量的所有级别时,绘图之间的颜色比例和图例一致

Posted

技术标签:

【中文标题】当数据中不存在分组变量的所有级别时,绘图之间的颜色比例和图例一致【英文标题】:Consistent color scale and legend between plots when not all levels of a grouping variable are present in the data 【发布时间】:2016-04-29 06:12:26 【问题描述】:

我有数据被顺序添加到 R 中的data.frame。我经常创建图表来显示结果。该图根据某些标准进行了颜色编码,其中一些标准从未满足,因此图表上没有这种颜色。

例如,

library(ggplot2)
dates15=seq(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-06-30 23:45:00"), by="15 min")
ex.data=rnorm(length(dates15),2,1)
blue=c(1:5000)
pink=which(ex.data>50)
purple=c(10000:15000)
colours=rep("Black points", length(dates15))
colours[blue]="Blue Points"
colours[pink]="Pink points"
colours[purple]="Purple points"
all.data=data.frame(Date=dates15, Data=ex.data, Colours=colours)
g.cols=c("black", "blue", "pink", "purple")
ggplot(all.data, aes(Date, Data, colour=Colours, group=1))+geom_line()+scale_color_manual(values=g.cols)+
  xlim(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-02-12 23:45:00"))

在此示例中,我将变量 pink 设置为仅大于 50 的点(这在我的数据中显然是不可能的)。因此,在创建绘图时,缺少“Pink”图例名称,但已将粉红色分配给紫色标签。我希望颜色和标签始终保持匹配,即使有一个未使用的变量。

【问题讨论】:

【参考方案1】:

设置Colours 的因子水平以包括所有可能的值,无论是否存在于手头数据中,然后将drop=FALSE 添加到scale_colour_manual

all.data=data.frame(Date=dates15, Data=ex.data, Colours=colours)
g.cols=c("black", "blue", "pink", "purple")
all.data$Colours = factor(all.data$Colours, levels=sort(c(unique(colours), "Pink Points")))

ggplot(all.data, aes(Date, Data, colour=Colours, group=1)) + 
  geom_line() +
  scale_color_manual(values=g.cols, drop=FALSE) +
  xlim(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-02-12 23:45:00"))

【讨论】:

这太完美了!谢谢:)

以上是关于当数据中不存在分组变量的所有级别时,绘图之间的颜色比例和图例一致的主要内容,如果未能解决你的问题,请参考以下文章

R语言可视化分面图多变量分组多水平t检验可视化多变量分组多水平分面箱图(faceting boxplot)并添加显著性水平在标签和绘图上边框之间添加15%的空格

使用 seaborn 绘图时,如何为色调参数指定多个变量?

R绘图基础指南 3. 散点图(合集)

在绘图和分面条之间移动轴标签

JPQL:当数据库中不存在对象时切换/案例

R语言boxplot大样本分组绘图