为什么变量在图例中被认为是连续的?
Why is the variable considered continous in legend?
我使用下面的代码用 ggplot 生成了一个图:
- 我希望图例显示运行 1-8 而仅显示卷 12.5 和 25 为什么不显示它?
- 即使有重叠,是否可以显示图中的所有点?因为现在由于重叠,该图仅显示 8 个点中的 4 个。
OP。您已经得到了部分答案。根据您的补充评论和一些解释,这是一个解决方案。
作为参考,您正在寻找:
- 将连续变量更改为 discrete/discontinuous 变量并在图例中反映出来。
- 显示图例中标记的 运行s 1-8
- 根据数据集中的某些条件断开线。
首先,我在这里再次以可重现的方式表示您的数据(并删除多余的字符,以便您可以直接跟进所有代码):
library(ggplot2)
mydata <- data.frame(
`Run`=c(1:8),
"Time"=c(834, 834, 584, 584, 1184, 1184, 938, 938),
`Area`=c(55.308, 55.308, 79.847, 79.847, 81.236, 81.236, 96.842, 96.842),
`Volume`=c(12.5, 12.5, 12.5, 12.5, 25.0, 25.0, 25.0, 25.0)
)
更改为离散变量
如果您检查每一列的变量类型(类型 str(mydata)
),您会看到 mydata$Run
是一个 int
,其余列是 num
.每列都被理解为一个数字,它被视为一个连续变量。当需要绘制数据时,ggplot2
理解这意味着由于这些值之间存在值是合理的(它们是连续的),所以图例形式的任何表示都应该能够表明这一点。因此,您得到的是连续色标而不是离散色标。
要强制 ggplot2
给你一个离散的比例,你必须让你的数据离散并表明它是一个因素。您可以在绘图之前将变量设置为一个因素(例如:mydata$Run <- as.factor(mydata$Run)
,或使用内联代码,指的是 aes(size = factor(Run),...
而不仅仅是 aes(size = Run,...
.
在您的 ggplot
调用中使用对 factor(Run)
内联的引用具有将变量名称更改为图例中的“factor(运行)”的效果,因此您还必须将其添加到 labs()
对象调用中。最后,剧情代码是这样的:
ggplot(data = mydata, aes(x=Area, y=Time)) +
geom_point(aes(color =as.factor(Volume), size = Run)) +
geom_line() +
labs(
x = "Area", y = "Time",
# This has to be changed now
color='Volume'
) +
theme_bw()
请注意,在上面的代码中,我也不是指 mydata$Run
,而是指 Run
。使用 ggplot2
时最好只引用列的名称。这两种方式都有效,但在实践中要好得多。
断开线路
你的线在整个数据中连接的原因是因为 geom_line()
对象除了 x=
和 y=
的美学之外没有任何信息。如果你想有单独的线,就像有单独的颜色或形状的点,你需要提供一种美学作为基础。由于根据数据集中的变量 Volume
,两条线是不同的,因此您想使用它......但两者保持相同的颜色。为此,我们使用 group=
美学。它告诉 ggplot2
我们要为按该美学分组的每条数据画一条线。
ggplot(data = mydata, aes(x=Area, y=Time)) +
geom_point(aes(color =as.factor(Volume), size = Run)) +
geom_line(aes(group=as.factor(Volume))) +
labs(
x = "Area", y = "Time", color='Volume'
) +
theme_bw()
显示图例中标记的 运行s 1-8
在这里,我正在阅读一些关于图例中“显示 运行s 1-8”的内容。这可能意味着两件事中的一件,我假设您两者都想要,并向您展示如何做到这两件事情。
- 在图例中列出并显示尺寸 1-8。
要设置您在比例尺(图例)中看到的尺寸值,您可以参考各种 scale_
各种美学类型的函数。在这种情况下,回想一下,由于 mydata$Run
是一个 int
,它被视为一个连续尺度。 ggplot2
不知道如何绘制连续的尺寸比例尺,所以图例本身显示了离散的点尺寸。这意味着我们不需要将 Run
更改为一个因子,但我们需要明确指出我们希望在图例中显示从 1 到 8 的序列中的所有中断。您可以使用 scale_size_continuous(breaks=...)
.
ggplot(data = mydata, aes(x=Area, y=Time)) +
geom_point(aes(color =as.factor(Volume), size = Run)) +
geom_line(aes(group=as.factor(Volume))) +
labs(
x = "Area", y = "Time", color='Volume'
) +
scale_size_continuous(breaks=c(1:8)) +
theme_bw()
- 将您的所有 运行 显示为分数。
关于显示所有 运行 的注释可能还意味着您希望从字面上看到每个 运行 在您的绘图中表示为一个离散点。为此……好吧,他们已经是了! ggplot2
正在将数据中的每个点绘制到图表中。由于某些点共享 x=
和 y=
的相同值,您正在过度绘制 - 这些点被绘制在彼此之上。
如果您想直观地看到此处表示的每个点,一种选择是使用 geom_jitter()
而不是 geom_point()
。它在这里并不是很好,因为它看起来像你的数据有不同的 x 和 y 值,但如果这是你想要做的,它是一个选项。请注意,在下面的代码中,为了更清楚起见,我还将点的形状更改为空心圆,其中 color=
是每个点周围的线(此处为黑色),而 fill=
审美改为用于音量。不过你应该明白了。
set.seed(1234) # using the same randomization seed ensures you have the same jitter
ggplot(data = mydata, aes(x=Area, y=Time)) +
geom_jitter(aes(fill =as.factor(Volume), size = Run), shape=21, color='black') +
geom_line(aes(group=as.factor(Volume))) +
labs(
x = "Area", y = "Time", fill='Volume'
) +
scale_size_continuous(breaks=c(1:8)) +
theme_bw()
我使用下面的代码用 ggplot 生成了一个图:
- 我希望图例显示运行 1-8 而仅显示卷 12.5 和 25 为什么不显示它?
- 即使有重叠,是否可以显示图中的所有点?因为现在由于重叠,该图仅显示 8 个点中的 4 个。
OP。您已经得到了部分答案。根据您的补充评论和一些解释,这是一个解决方案。
作为参考,您正在寻找:
- 将连续变量更改为 discrete/discontinuous 变量并在图例中反映出来。
- 显示图例中标记的 运行s 1-8
- 根据数据集中的某些条件断开线。
首先,我在这里再次以可重现的方式表示您的数据(并删除多余的字符,以便您可以直接跟进所有代码):
library(ggplot2)
mydata <- data.frame(
`Run`=c(1:8),
"Time"=c(834, 834, 584, 584, 1184, 1184, 938, 938),
`Area`=c(55.308, 55.308, 79.847, 79.847, 81.236, 81.236, 96.842, 96.842),
`Volume`=c(12.5, 12.5, 12.5, 12.5, 25.0, 25.0, 25.0, 25.0)
)
更改为离散变量
如果您检查每一列的变量类型(类型 str(mydata)
),您会看到 mydata$Run
是一个 int
,其余列是 num
.每列都被理解为一个数字,它被视为一个连续变量。当需要绘制数据时,ggplot2
理解这意味着由于这些值之间存在值是合理的(它们是连续的),所以图例形式的任何表示都应该能够表明这一点。因此,您得到的是连续色标而不是离散色标。
要强制 ggplot2
给你一个离散的比例,你必须让你的数据离散并表明它是一个因素。您可以在绘图之前将变量设置为一个因素(例如:mydata$Run <- as.factor(mydata$Run)
,或使用内联代码,指的是 aes(size = factor(Run),...
而不仅仅是 aes(size = Run,...
.
在您的 ggplot
调用中使用对 factor(Run)
内联的引用具有将变量名称更改为图例中的“factor(运行)”的效果,因此您还必须将其添加到 labs()
对象调用中。最后,剧情代码是这样的:
ggplot(data = mydata, aes(x=Area, y=Time)) +
geom_point(aes(color =as.factor(Volume), size = Run)) +
geom_line() +
labs(
x = "Area", y = "Time",
# This has to be changed now
color='Volume'
) +
theme_bw()
请注意,在上面的代码中,我也不是指 mydata$Run
,而是指 Run
。使用 ggplot2
时最好只引用列的名称。这两种方式都有效,但在实践中要好得多。
断开线路
你的线在整个数据中连接的原因是因为 geom_line()
对象除了 x=
和 y=
的美学之外没有任何信息。如果你想有单独的线,就像有单独的颜色或形状的点,你需要提供一种美学作为基础。由于根据数据集中的变量 Volume
,两条线是不同的,因此您想使用它......但两者保持相同的颜色。为此,我们使用 group=
美学。它告诉 ggplot2
我们要为按该美学分组的每条数据画一条线。
ggplot(data = mydata, aes(x=Area, y=Time)) +
geom_point(aes(color =as.factor(Volume), size = Run)) +
geom_line(aes(group=as.factor(Volume))) +
labs(
x = "Area", y = "Time", color='Volume'
) +
theme_bw()
显示图例中标记的 运行s 1-8
在这里,我正在阅读一些关于图例中“显示 运行s 1-8”的内容。这可能意味着两件事中的一件,我假设您两者都想要,并向您展示如何做到这两件事情。
- 在图例中列出并显示尺寸 1-8。
要设置您在比例尺(图例)中看到的尺寸值,您可以参考各种 scale_
各种美学类型的函数。在这种情况下,回想一下,由于 mydata$Run
是一个 int
,它被视为一个连续尺度。 ggplot2
不知道如何绘制连续的尺寸比例尺,所以图例本身显示了离散的点尺寸。这意味着我们不需要将 Run
更改为一个因子,但我们需要明确指出我们希望在图例中显示从 1 到 8 的序列中的所有中断。您可以使用 scale_size_continuous(breaks=...)
.
ggplot(data = mydata, aes(x=Area, y=Time)) +
geom_point(aes(color =as.factor(Volume), size = Run)) +
geom_line(aes(group=as.factor(Volume))) +
labs(
x = "Area", y = "Time", color='Volume'
) +
scale_size_continuous(breaks=c(1:8)) +
theme_bw()
- 将您的所有 运行 显示为分数。
关于显示所有 运行 的注释可能还意味着您希望从字面上看到每个 运行 在您的绘图中表示为一个离散点。为此……好吧,他们已经是了! ggplot2
正在将数据中的每个点绘制到图表中。由于某些点共享 x=
和 y=
的相同值,您正在过度绘制 - 这些点被绘制在彼此之上。
如果您想直观地看到此处表示的每个点,一种选择是使用 geom_jitter()
而不是 geom_point()
。它在这里并不是很好,因为它看起来像你的数据有不同的 x 和 y 值,但如果这是你想要做的,它是一个选项。请注意,在下面的代码中,为了更清楚起见,我还将点的形状更改为空心圆,其中 color=
是每个点周围的线(此处为黑色),而 fill=
审美改为用于音量。不过你应该明白了。
set.seed(1234) # using the same randomization seed ensures you have the same jitter
ggplot(data = mydata, aes(x=Area, y=Time)) +
geom_jitter(aes(fill =as.factor(Volume), size = Run), shape=21, color='black') +
geom_line(aes(group=as.factor(Volume))) +
labs(
x = "Area", y = "Time", fill='Volume'
) +
scale_size_continuous(breaks=c(1:8)) +
theme_bw()