如何在ggplot lineplot中为具有相似颜色的多个子类着色?

Posted

技术标签:

【中文标题】如何在ggplot lineplot中为具有相似颜色的多个子类着色?【英文标题】:How to colour multiple subclasses with similar colours in ggplot lineplot? 【发布时间】:2020-07-12 02:33:50 【问题描述】:

所以,就像问题一样,我有这个数据框,它也被绘制:

library("ggplot2")
set.seed(1278)
classes <- c("a1", "a2", "a3", "a4", "b1", "b2", "b3", "b4", "b5", "c1", "c2", "c3")
kinds <- c("WWW", "XXX", "YYY", "ZZZ", "QQQ", "VVV")
values <- seq(1:100)

vK <- vector()
vC <- vector()
vals <- vector()
for (k in kinds) 
    vK <- append(vK, rep(k, length(classes)))
    vC <- append(vC, classes)
    vals <- append(vals, sample(values, length(classes), replace=T))


df <- cbind.data.frame(vC, vK, vals)
colnames(df) <- c("class", "kind", "value")

ggplot(data=df, aes(x=kind, y=value, group=class, color=class)) + geom_line()

问题是每个 用不同的颜色表示,它反映了变量中的数字,即 子类,即 a1、a2 等。我需要什么是用相似的颜色绘制每个类。在这个例子中,我们有 3 个实际的类,即“a”、“b”和“c”。有没有办法为 子类 1、2、3...、“b”用不同的蓝色阴影等为“a”着色...

我尝试了类似的方法,但由于类丢失了 子类,因此没有成功 :

df$class <- as.factor(gsub("1|2|3|4|5|6|7|8|9|0", "", df$class))

ggplot(data=df, aes(x=kind, y=value, group=class, color=class)) + geom_line()

这意味着我需要保留子类。

我也对不同的情节持开放态度!

【问题讨论】:

您没有使用scale_color_manual 为每个子类添加自己的(相似的)颜色是否有原因?这会让你更清楚你想要什么。 @Nova 好吧,不。但是......即使我有很多课程,它会起作用吗?我将如何处理它?也许通过生成多个调色板,每个类一个? 为什么不facet_wrap()facet_grid()?现在的情节很忙。 @Dunois,实际上我还有更多的子类。 facet_wrap() 是什么意思? @gabt 我将class 变量分成两部分(字母和数字),并使用字母创建单独的图,其中每个数据集将由各自的数字着色使用facet_wrap()。喜欢this。 【参考方案1】:

你的方法是对的。只需添加两个附加变量,一个用于超类,一个用于子类。例如,您想到的子类的阴影可以使用alpha 美学来实现。试试这个:

library("ggplot2")
set.seed(1278)
classes <- c("a1", "a2", "a3", "a4", "b1", "b2", "b3", "b4", "b5", "c1", "c2", "c3")
kinds <- c("WWW", "XXX", "YYY", "ZZZ", "QQQ", "VVV")
values <- seq(1:100)

vK <- vector()
vC <- vector()
vals <- vector()
for (k in kinds) 
  vK <- append(vK, rep(k, length(classes)))
  vC <- append(vC, classes)
  vals <- append(vals, sample(values, length(classes), replace=T))


df <- cbind.data.frame(vC, vK, vals)

colnames(df) <- c("class", "kind", "value")

df$class1 <- as.factor(gsub("[0-9]", "", df$class))
df$subclass1 <- as.factor(gsub("[a-z]", "", df$class))
df$subclass1 <- as.numeric(df$subclass1)

ggplot(data=df, aes(x=kind, y=value, group=class, color=class1, alpha = subclass1)) + 
  geom_line() +
  scale_alpha_continuous(range = c(.5, 1))

由reprex package (v0.3.0) 于 2020 年 3 月 31 日创建

【讨论】:

这很好。有没有办法避免出现两个图例? 当然。你心目中的传奇是怎样的?如果我猜的话,可能会显示所有 12 行。 实际上,我想为每个类一个,而不需要显示子类。重点是通过绘制所有子类来显示平均差异。 在这种情况下,只需添加+ guides(alpha = FALSE) guide如何在不指定的情况下使用类?

以上是关于如何在ggplot lineplot中为具有相似颜色的多个子类着色?的主要内容,如果未能解决你的问题,请参考以下文章

在 ggplot2 中为时间序列数据绘制具有置信区间的平均值

使用 ggplot2 在 r 中为热图准备数据框

如何在 r 中为 ggplot 自定义调色板?

如何在绘图标题或标签中为文本加下划线? (ggplot2)

如何在 R 中的 ggplot 中为条形图添加误差线

如何在 R 中为 ggplot 的每个方面添加 R2?