在ggplot中更改特定类别的线型?

3

我有一些数据。

library(reshape2)
library(ggplot2)
df = data.frame(cat = LETTERS[1:6], VAR1 = runif(6), VAR2 = runif(6), VAR3 = runif(6), VAR4 = runif(6))
 df_melted = melt(df, id.vars = 'cat')
 ggplot(df_melted, aes(x = variable, y = value)) + geom_line(aes(color = cat, group = cat))

我需要绘制A和B的线条在最上层(覆盖其他线条),并且线条类型为实线。其他"cat"的线条类型应为虚线。
1个回答

6
这可以通过以下步骤实现:
  1. 按类别(cat)降序排列您的df,使A和B排在最后
  2. 将条件cat %in% c("A", "B")映射到linetype上
  3. 使用scale_linetype_manual设置TRUE和FALSE的linetypes
  4. 使用guides去掉linetype图例
library(reshape2)
library(ggplot2)
df = data.frame(cat = LETTERS[1:6], VAR1 = runif(6), VAR2 = runif(6), VAR3 = runif(6), VAR4 = runif(6))
df_melted = melt(df, id.vars = 'cat')
df_melted <- arrange(df_melted, desc(cat))
#> Error in arrange(df_melted, desc(cat)): could not find function "arrange"
ggplot(df_melted, aes(x = variable, y = value)) + 
  geom_line(aes(color = cat, group = cat, linetype = cat %in% c("A", "B"))) +
  scale_linetype_manual(values = c("TRUE" = "solid", "FALSE" = "dotted")) +
  guides(linetype = FALSE)

编辑 实现你的结果的另一种方法可能如下所示。我在这里也使用了相同的模式来调整大小。我喜欢这种方法的原因是我们不需要条件,而且只有一个图例:

library(reshape2)
library(ggplot2)
library(dplyr)

df = data.frame(cat = LETTERS[1:6], VAR1 = runif(6), VAR2 = runif(6), VAR3 = runif(6), VAR4 = runif(6))
df_melted = melt(df, id.vars = 'cat')
df_melted <- arrange(df_melted, desc(cat))
ggplot(df_melted, aes(x = variable, y = value, group = cat)) + 
  geom_line(aes(color = cat, linetype = cat, size = cat)) +
  scale_linetype_manual(values = c(A = "solid", B = "solid", rep("dotted", 4))) +
  scale_size_manual(values = c(A = 1, B = 1, rep(.5, 4)))


1
只需删除 guides(linetype=FALSE) 这一行即可。如果您想要为图例添加漂亮的标签,可以在 scale_linetype_manual 中使用 labels = c("TRUE" = XXX, "FALSE" = YYY) - stefan
只有一件事,请问它们不会覆盖其他行吗?如何解决?还有如何选择A和B的颜色? - temor
一般来说,如果我想指定它们的颜色、大小等,该怎么做? - temor
1
嗨@temor。一般来说,您可以遵循我用于linetype的相同模式。将条件映射到颜色、大小等,并通过scale_xxx_manual设置颜色或大小。我刚刚进行了编辑,其中1.显示了实现结果的不同方法。2.添加了大小作为另一个aes。最好的S。 - stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接