在散点图中操作级别颜色的最佳方法 - ggplot2(分层图 and/or 将颜色分配给特定行 values/or 其他?)

Best Approach to manipulate level colors in a scatterplot - ggplot2 (layering plots and/or assigning colors to specific row values/or something else?)

这是我的数据框示例:

HRdetails <- data.frame(avgHR = c(96,115,130,120,112,87,112,114,116,140),
                   DetailCount = c(5,18,4,3,9,2,10,11,19,15),
                   PID = c(1,1,1,1,1,2,2,2,2,2), 
                   Section = c("lab","s1","s2","s3","s4","lab","s1","s2","s3","s4"))
data$Section<-as.factor(data$Section)
data$PID<-as.factor(data$PID)
data$DetailCount<-as.integer(data$DetailCount)

我正在绘制一个散点图,其中包含每个参与者的单独预测线和样本的总体回归线。

这是我的情节的图片:

这是我用来绘制上图的代码:

ggplot(data = data, aes(x = avgHR, y = DetailCount)) +
   geom_point(aes(colour=factor(PID)), method="lm", alpha=.75,size = 2) +
   scale_color_manual(values=coul) +
   geom_smooth(aes(colour=factor(PID)), method="lm", alpha=.75,size = .5, se=F) +
   geom_smooth(method="lm", color="black") +
   theme(legend.position="none")

变量 coul 是我的自定义调色板:

coul<-c("#666699","#CCCCFF","#996699","#FFFFCC","#99CC99","#336666","#006699","#000066")
coul<-colorRampPalette(coul)(50)
pie(rep(1, length(coul)), col = coul, main="")

如您在 df 中所见,“部分”因素中的一个级别标记为“实验室”。我希望我的图形的其他“部分”的所有点都从我制作的 coul 调色板中着色,但我希望所有“实验室”部分都从这个 lab 调色板中着色:

lab<-brewer.pal(n=9, name="YlOrRd")
lab<-colorRampPalette(lab)(45)
pie(rep(1, length(lab)), col=lab, main="")

如果我单独绘制实验室点,这就是散点图的样子:

这是该散点图的代码:

ggplot(data=labstats, aes(x=avgHR, y=DetailCount)) +
  geom_point(aes(colour=factor(PID))) +
  scale_color_manual(values=lab) +
  theme(legend.position = "none")

这是我正在使用的实验室照片:

最好的绘图方法是什么,可以显示我的 lab 调色板中的所有实验室点和 coul 调色板中的其余点?

我一直在研究将这些图堆叠在一起,因为理论上这似乎最简单,但我很难弄清楚如何将它们无误地组合起来并使用两个不同的 df。我还考虑过将 lab 调色板分配给原始模型可视化中的特定行值,但这似乎 difficult/I 认为 ggplot 不具备这样做的能力。 如果我错了请纠正我and/or帮我解决这个问题。此外,我正在使用调色板,因为每个参与者都需要为每个数据点拥有自己的离散颜色值。提前致谢。

由于您希望每个部分和 PID 具有独特的颜色,因此您可以定义一个交互。要在每次交互中获得正确的颜色,您可以创建一个命名向量,然后将该命名向量提供给 scale_color_manual.

library(ggplot2)
library(RColorBrewer)
library(scales) # only used to display color palettes for debugging purposes

data <- data.frame(avgHR = c(96,115,130,120,112,87,112,114,116,140),
                        DetailCount = c(5,18,4,3,9,2,10,11,19,15),
                        PID = c(1,1,1,1,1,2,2,2,2,2), 
                        Section = c("lab","s1","s2","s3","s4","lab","s1","s2","s3","s4"))
data$Section<-as.factor(data$Section)
data$PID<-as.factor(data$PID)
data$DetailCount<-as.integer(data$DetailCount)

# generate palettes per group
num_lab <- sum(data$Section == 'lab')
num_non_lab <- sum(data$Section != 'lab')

coul<-c("#666699","#CCCCFF","#996699","#FFFFCC","#99CC99","#336666","#006699","#000066")
coul<-colorRampPalette(coul)(sum(data$Section != 'lab'))

lab<-brewer.pal(n=9, name="YlOrRd")
lab<-colorRampPalette(lab)(sum(data$Section == 'lab'))

# display the color palettes
show_col(coul)
show_col(lab)

# create the combined palette, where participants from each group get assigned a color from
# the palette for their group
color_palette <- array(NA, nrow(data))
color_palette[data$Section == 'lab'] <- lab
color_palette[data$Section != 'lab'] <- coul
names(color_palette) <- interaction(data$PID, data$Section)

# plot the data
ggplot(data <- data, aes(x = avgHR, y = DetailCount, color = interaction(PID, Section))) +
  geom_point() + scale_color_manual(values=color_palette)

我在绘图过程中还注意到实验室和非实验室的调色板共享一种颜色(十六进制 #FFFFCC)。您应该选择不会重叠的不同调色板。这就是为什么实验室和非实验室中的点都出现这种颜色的原因。

'Coul' 调色板:

'Lab' 调色板: