我正在尝试在R中创建一个类似于下面的图,但是事实证明,这比仅在excel中创建困难。 X是分类变量,y是连续变量,则颜色将是二分变量,而线型则是另一个。我该怎么做呢?我尝试使用以下代码,但是如果更改线的尺寸或颜色之一,它只会发出一条提示“错误:geom_path:如果使用的是点划线或虚线,则颜色,大小和线型必须在该线上保持不变”。我该如何适应?
(Hawaiian name—koae)
答案 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")
这是它产生的情节。
答案 2 :(得分:1)
诀窍是从您的变量var1
和var2
中创建一个交互变量,它给出一个具有四个级别的因子,分别代表四个series
。 (基本上,这对应于@AllanCameron答案中的group
变量)。然后可以将此新的交互变量同时映射到color
和linetype
上,从而生成一个图例。然后可以通过scale_color_manual
和scale_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")