ggplot2-4个类别和1个连续变量

时间:2020-08-03 10:34:14

标签: r ggplot2 plot

我正在尝试在R中创建一个类似于下面的图,但是事实证明,这比仅在excel中创建困难。 X是分类变量,y是连续变量,则颜色将是二分变量,而线型则是另一个。我该怎么做呢?我尝试使用以下代码,但是如果更改线的尺寸或颜色之一,它只会发出一条提示“错误:geom_path:如果使用的是点划线或虚线,则颜色,大小和线型必须在该线上保持不变”。我该如何适应?

(Hawaiian name—koae)

5

enter image description here

3 个答案:

答案 0 :(得分:1)

可以通过添加分组变量和分组美感来实现。这是完整的说明:

library(ggplot2)

vals <- c(11, 13, 12, 14)

df <- data.frame(
  x = rep(1:4, 4),
  y = c(vals, 2 * vals, 3 * vals, 4 * vals),
  colours = rep(c("#bf6424", "black"), each = 8),
  linetype = rep(rep(2:1, each = 4), 2),
  group = rep(1:4, each = 4))


ggplot(df, aes(x, y, colour = colours, linetype = linetype, group = group)) +
  geom_line(size = 2) +
  scale_color_identity() +
  scale_linetype_identity() +
  theme_classic()

reprex package(v0.3.0)于2020-08-03创建

答案 1 :(得分:1)

如果您发布数据样本,则更容易发现问题出在哪里,以便我们获取您的ggplot代码并运行它以查看会发生什么。

但是,快速检查您的代码会发现一些问题。您正在将Probability变量映射到四种美感:组,颜色,线型和形状。组,颜色和线型中的每一个都需要映射到不同的变量。

这是一个最小的示例。在此示例中,我有一个名为group的虚拟变量,用于分隔每一行。我将var1映射为颜色,将var2映射为线型。由于我的数据在x,y,组,颜色和线型的每种组合中只有一个点,因此我需要设置stat = identity,让geom_line知道这是故意的。

df <- data.frame(x = factor(rep(1:4, 4)),
                 y = c(10, 15, 10, 15, 20, 25, 20, 25, 30, 35, 30, 35, 40, 45, 40, 45),
                 group = factor(c(rep(0, 4), rep(1, 4), rep(2, 4), rep(3, 4))),
                 var1 = factor(c(rep(0, 8), rep(1, 8))),
                 var2 = factor(c(rep(0, 4), rep(1, 4), rep(0, 4), rep(1, 4)))
                 )
ggplot(df) + 
  geom_line(aes(x, y, group = group, color = var1, linetype = var2), stat="identity")

这是它产生的情节。

a line plot with four lines of different color and linetype

答案 2 :(得分:1)

诀窍是从您的变量var1var2中创建一个交互变量,它给出一个具有四个级别的因子,分别代表四个series。 (基本上,这对应于@AllanCameron答案中的group变量)。然后可以将此新的交互变量同时映射到colorlinetype上,从而生成一个图例。然后可以通过scale_color_manualscale_linetype_manual设置颜色和线型。试试这个:

library(ggplot2)
library(dplyr)

set.seed(42)

df <- data.frame(
  var1 = factor(rep(1:2, each = 20, length = 40)),
  x = rep(1:5, each = 4),
  var2 = factor(rep(1:2, each = 2)),
  var3 = factor(rep(1:2, each = 1)),
  y = runif(40, 300, 500)
)

df %>% 
  mutate(series = interaction(var1, var2, sep = "_")) %>% 
  ggplot() + 
  geom_line(aes(x, y, color = series, linetype = series), stat="identity") + 
  scale_color_manual(values = c("orange", "orange", "black", "black"),
                     labels = paste0("series", 1:4)) +
  scale_linetype_manual(values = c("dashed", "solid", "dashed", "solid"),
                        labels = paste0("series", 1:4)) +
  facet_wrap(~ var3, scales="free") +
  theme(legend.position = "bottom")