我正在 ggplot 中绘制图表。一切都很好,但现在我对图例有疑问。我想重新排列图例。我现在得到的传说是
0-63
100-200
200-400
63-100
我想要的是。我想将最后一个值移动到第二个位置。应该是这样的
0-63
63-100
100-200
200-400
我的代码如下
我的数据看起来像这样,但最多 1000 行
time less63 63_100 100_200 200_400
06:01 0 4 3 1
06:02 2 6 6 5
06:03 4 8 8 6
06:04 6 9 7 8
06:05 7 10 8 7
06:06 3 11 3 7
06:07 6 7 2 2
06:08 7 3 0 3
ggplot(df)+
geom_area(aes(x=time,y=less63,fill="0-63"),alpha=0.5)+
geom_area(aes(x=time,y=63_100,fill="63-100"),alpha=0.5)+
geom_area(aes(x=time,y=100_200,fill="100-200"),alpha=0.5)+
geom_area(aes(x=time,y=200_400,fill="200-400"),alpha=0.5)+
scale_colour_manual(name="Legend", values = c("0-63" = "red","63-100" = "green","100-200" = "black","200-400" = "blue"))
Run Code Online (Sandbox Code Playgroud)
在这方面我将非常感激
您要做的第一件事是将数据转换为Tidy Data格式。geom_area()请注意您如何为数据集中的每种填充颜色指定一个函数并手动命名它们?所构建的图形语法背后的哲学ggplot2是,您可以使用映射函数aes()来ggplot2定义分离以及如何分离fill=应用数据集中的观察结果。我们将在这里执行此操作,然后演示一些其他内容,使您的情节正常运行......以及最终以正确的顺序制作您的图例。
为了整理数据,您需要将除时间之外的列收集到 2 个新列中:一列用于指定将映射到填充美学的范围(即“0-63”或“100-200”),另一列用于指定范围(即“0-63”或“100-200”)。指定将映射到 y 美学的值。数据表明df_original,您的值分布在多个列中(它们应该位于一列中),并且这些列的名称实际上应该收集到一个单独的列中。这样做的结果称为“收集”或使数据“长”。
在这里,我们将使用pivot_longer():
library(ggplot2)
library(dplyr)
library(tidyr)
library(scales)
df_original <- read.table(text="time less63 63_100 100_200 200_400
06:01 0 4 3 1
06:02 2 6 6 5
06:03 4 8 8 6
06:04 6 9 7 8
06:05 7 10 8 7
06:06 3 11 3 7
06:07 6 7 2 2
06:08 7 3 0 3", header=TRUE)
df <- df_original %>%
pivot_longer(
cols = -time, # take everything except time column
names_to = "ranges",
values_to = "val"
) %>%
mutate(ranges = factor(
ranges,
levels=c("less63", "X63_100", "X100_200", "X200_400"),
labels=c("0-63", "63-100", "100-200", "200-400")))
Run Code Online (Sandbox Code Playgroud)
然后您想将该df$range列更改为一个因子。在这里,您可以使用参数指定范围的顺序levels=,当我们这样做时,您可以通过参数指定它们的外观(重命名)labels=:
df <- df %>%
mutate(ranges = factor(
ranges,
levels=c("less63", "X63_100", "X100_200", "X200_400"),
labels=c("0-63", "63-100", "100-200", "200-400")))
Run Code Online (Sandbox Code Playgroud)
最后一步是将df$time列转换为POSIXct对象,这意味着我们可以将其作为时间对象引用。您可以查看帮助来strptime()查看字符串所format=引用的内容:
# OP states time is in hours:minutes, so reflected here
df$time <- as.POSIXct(df$time, format="%H:%M")
Run Code Online (Sandbox Code Playgroud)
现在绘图非常简单。由于我们整理了数据,所以我们只需使用一次geom_area()调用即可。此外,我们对范围的因子级别进行了重新排序,因此图例中对象的顺序被设置为应有的方式,并且由于参数而看起来应有的方式labels=。
还有一件事:您需要引用scale_fill_manual()not scale_colour_manual(),因为映射的美学geom_area()是填充:
ggplot(df, aes(x=time, y=val, fill=ranges)) +
geom_area(alpha=0.5) +
scale_x_time(labels = scales::time_format(format = "%H:%M")) +
scale_fill_manual(name="Legend", values = c("0-63" = "red","63-100" = "green","100-200" = "black","200-400" = "blue"))
Run Code Online (Sandbox Code Playgroud)
OP 表示他们正在创建一个重叠的情节。默认情况下,映射填充的图层位置geom_are()设置为“堆叠”,这意味着 y 值堆叠在彼此之上。这样可以轻松查看和了解区域在 x 轴上的变化方式。然而,OP 想要准备一个图,其中 y 值是......值。这将position="identity"产生重叠区域。您可以在这里看到直接效果:
ggplot(df, aes(x=time, y=val, fill=ranges)) +
geom_area(alpha=0.2, position="identity") +
scale_x_time(labels = scales::time_format(format = "%M:%S")) +
scale_fill_manual(name="Legend", values = c("0-63" = "red","63-100" = "green","100-200" = "black","200-400" = "blue"))
Run Code Online (Sandbox Code Playgroud)
您可以看到,即使减少该alpha=值,也很难辨别发生了什么。如果您想更清楚地查看此信息,我建议使用水平放置的面作为更好的查看选项:
ggplot(df, aes(x=time, y=val, fill=ranges)) +
geom_area(alpha=0.2, position="identity") +
scale_x_time(labels = scales::time_format(format = "%M:%S")) +
scale_fill_manual(name="Legend", values = c("0-63" = "red","63-100" = "green","100-200" = "black","200-400" = "blue")) +
facet_grid(ranges ~ .)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3488 次 |
| 最近记录: |