R ggplot:为什么我必须将数据转换为长格式?
使用ggplot绘图时,我经常需要将数据转换为长格式,例如,如下面的代码所示。我有两个问题:R ggplot:为什么我必须将数据转换为长格式?,r,dataframe,ggplot2,R,Dataframe,Ggplot2,使用ggplot绘图时,我经常需要将数据转换为长格式,例如,如下面的代码所示。我有两个问题: 有没有办法将列(因此每个变量)用作“组”?所以每一列都被绘制出来,并且有不同的颜色?因此,无需将数据转换为长格式。(无需将每个变量放入geom_line()) 为什么必须将数据转换为长格式?背后的原因是什么?当您的数据具有宽格式时,它如何比打印更好 示例代码: library(tidyverse) # Data in wide format df_wide <- data.frame(
geom_line()
)library(tidyverse)
# Data in wide format
df_wide <- data.frame(
Horizons = seq(1,10,1),
Country1 = c(2.5, 2.3, 2.2, 2.2, 2.1, 2.0, 1.7, 1.8, 1.7, 1.6),
Country2 = c(3.5, 3.3, 3.2, 3.2, 3.1, 3.0, 3.7, 3.8, 3.7, 3.6),
Country3 = c(1.5, 1.3, 1.2, 1.2, 1.1, 1.0, 0.7, 0.8, 0.7, 0.6)
)
# Convert to long format
df_long <- df_wide %>%
gather(key = "variable", value = "value", -Horizons)
# Plot the lines
plotstov <- ggplot(df_long, aes(x = Horizons, y = value)) +
geom_line(aes(colour = variable, group = variable))+
theme_bw()
库(tidyverse)
#宽格式数据
df_-wide很难说这是不可能的——例如,有人可以为ggplot
编写一个包装包,自动为您完成这项工作——但没有像这样明显的解决方案
Hadley Wickham,ggplot
的作者,已经建立了整个“tidyverse”生态系统的概念,这基本上是长格式的数据。使用长格式数据的基本原因是,相同的数据可以用许多宽格式表示,但长格式通常是唯一的。例如,假设您有按年度、国家和工业部门表示收入的数据。在广泛的格式中,列是表示年份、国家、部门还是某种组合?在tidyverse/ggplot世界中,您可以简单地指定要用作分组变量的变量。使用广泛的面向格式的工具(如base R的matplot
),您可以首先重塑数据,使列表示分组变量(例如,年份),然后进行绘图
Wickham及其同事在更新版本的tidyverse中构建了gather
(或pivot\u longer
)等工具,以便于转换为长格式,并构建了多种其他工具来处理长(“tidy”)数据
您可以围绕
ggplot
编写包装,以完成转换…正如我所看到的,您已经有了第二个问题的答案,因此我将在这里重点讨论第一个问题
回答2-是的,有一种方法可以分别绘制每一列,具体如下:
# load environment
library(ggplot2)
# create dataframe
df <- data.frame(
Horizons = seq(1,10,1),
Country1 = c(2.5, 2.3, 2.2, 2.2, 2.1, 2.0, 1.7, 1.8, 1.7, 1.6),
Country2 = c(3.5, 3.3, 3.2, 3.2, 3.1, 3.0, 3.7, 3.8, 3.7, 3.6),
Country3 = c(1.5, 1.3, 1.2, 1.2, 1.1, 1.0, 0.7, 0.8, 0.7, 0.6)
)
# plot
ggplot(df) +
geom_line(aes(x = Horizons, y = Country1, colour = 'Country1')) +
geom_line(aes(x = Horizons, y = Country2, colour = 'Country2')) +
geom_line(aes(x = Horizons, y = Country3, colour = 'Country3'))
theme_bw()
#加载环境
图书馆(GG2)
#创建数据帧
df您必须添加在不同geom_行中分隔的每个变量,这是您想要的吗?谢谢您的评论!我知道情况就是这样。但是,难道没有自动执行的选项吗?比如当你有长格式的数据时?我相信这就是tidyverse函数存在的原因,但是你可以在管道中直接将pivot与绘图连接起来,以避免创建一个单独的对象,然后再进行绘图!谢谢你的回答!最后,我结束了这个问题:)我一直认为它可能有一些其他的原因谢谢你的回答!我早就知道了。我想知道是否有一种方法不需要将每个变量都放入geom\u行
。我的问题不够清楚,这不是我想要的,我的错。不过还是要谢谢你的awnser。