在 R 中绘制一系列数据
Plotting a series of data in R
我有一个包含以下行的 CSV 文件:
10,130,A,100,1000
10,130,B,200,-200
10,130,C,300,1200
20,140,A,120,1050
20,140,B,220,-300
20,140,C,320,1250
30,120,A,145,1130
30,120,B,255,1000
30,120,C,355,1110
...
依此类推,在第一列中每增加三行 10
。对于第 3 列(A、B 和 C)中的每种类型,每行在第 4 列和第 5 列中包含两个值。对于每组三行,第 1 列和第 2 列中的值相同。
我用以下方式阅读:
data <- read.csv("data_out.csv", header=FALSE, sep=",")
从文件中读取的每组三行包含 8 个值,可以在图表上绘制为 Y(前三行的示例):
- 第 1 列中的值 (10)
- 第 2 列中的值 (130)
- 第 4 列中类型 A 的值 (100)
- 第 5 列中类型 A 的值 (1000)
- 类型 B 的第 4 列中的值 (200)
- 类型 B 的第 5 列中的值 (-200)
- 类型 C 的第 4 列中的值 (300)
- 第 5 列中类型 C 的值 (1200)
它们将被绘制为 X = 10。
因此前 8 个点的坐标 (X,Y) 如下:
(10,10); (10,130); (10,100); (10,1000); (10,200); (10,-200); (10,300); (10,1200)
第 1 列中 20 的下三行坐标为:
(20,20); (20,140); (20,120); (20,1050); (20,220); (20,-300); (20,320); (20,1250)
对于输入文件中的第三行和任何进一步的三行集合也是如此。
代表每组三行的这 8 个值中的每一个的点应连接以形成折线图,similar to this one(但有 8 个折线图,而不是示例中的 4 个)。因此,同一张图上会有 8 个折线图,代表 X=10、X=20、X=30 等的值。
问题解答
我知道如何绘制一条线,例如plot(data[,1],data[,4],type="l")
但如何绘制多条线?
以及如何确保 Y 的 0 在正确的位置,以便 C5 的负值也可以正确绘制?
此外,我知道有 aggregate
函数可用于按类型 (A, B, C) 分组,但我不想执行任何汇总或平均操作,所以我可能正在寻找过滤器(按类型)而不是聚合?
我可能还想确保 C1 中不同值的数量与 C2 中的相同(纯粹是为了验证输入数据是否正确)。
考虑到您添加到 edit2 中的数据,我将再次解决您的问题。希望你能在这个解释后解决你的实际问题。
你说你从 csv 中读取的数据框:
df = data.frame(
c(10,130,"A",100,1000),
c(10,130,"B",200,-200),
c(10,130,"C",300,1200),
c(20,140,"A",120,1050),
c(20,140,"B",220,-300),
c(20,140,"C",320,1250),
c(30,120,"A",145,1130),
c(30,120,"B",255,1000),
c(30,120,"C",355,1110))
我们需要将其转置为列格式,您最初在 post 中提到过。
df = data.frame(t(df))
我按照您的示例命名该列:
names(df) = c("C1","C2","C3","C4","C5")
正在安装包并将其读取到 R:
install.packages("reshape2")
install.packages("ggplot2")
library(reshape2)
library(ggplot2)
melt
将您的数据重塑为有助于绘制图表的长格式。第一个变量 C4
和 C5
被转换为长格式,并重命名以在图中识别它们。
d1 = melt(df[,c(1,3:5)], id.vars = c("C1","C3"), measure.vars = c("C4","C5"), variable.name = "col")
d1$group = paste0(d1$C3,d1$col)
然后变量C1
和C2
在没有[A,B,C]
的情况下融化。
d2 = unique(melt(df[,c(1:2)], id.vars = "C1", measure.vars = c("C1","C2"), variable.name = "group"))
两个融化的数据集都按绘图所需的列组合。
p = rbind(d1[,c("C1","group","value")], d2[,c("C1","group","value")])
p$value = as.numeric(p$value)
您可以绘制,根据您创建的组为线条着色以识别它们,然后绘制标签以读取值。
ggplot(p, aes(x=C1, y=value, group=group, color=group, label=value)) +
geom_line() + geom_point() + geom_text(aes(label=value, hjust= 1, vjust=-1))
我有一个包含以下行的 CSV 文件:
10,130,A,100,1000
10,130,B,200,-200
10,130,C,300,1200
20,140,A,120,1050
20,140,B,220,-300
20,140,C,320,1250
30,120,A,145,1130
30,120,B,255,1000
30,120,C,355,1110
...
依此类推,在第一列中每增加三行 10
。对于第 3 列(A、B 和 C)中的每种类型,每行在第 4 列和第 5 列中包含两个值。对于每组三行,第 1 列和第 2 列中的值相同。
我用以下方式阅读:
data <- read.csv("data_out.csv", header=FALSE, sep=",")
从文件中读取的每组三行包含 8 个值,可以在图表上绘制为 Y(前三行的示例):
- 第 1 列中的值 (10)
- 第 2 列中的值 (130)
- 第 4 列中类型 A 的值 (100)
- 第 5 列中类型 A 的值 (1000)
- 类型 B 的第 4 列中的值 (200)
- 类型 B 的第 5 列中的值 (-200)
- 类型 C 的第 4 列中的值 (300)
- 第 5 列中类型 C 的值 (1200)
它们将被绘制为 X = 10。
因此前 8 个点的坐标 (X,Y) 如下:
(10,10); (10,130); (10,100); (10,1000); (10,200); (10,-200); (10,300); (10,1200)
第 1 列中 20 的下三行坐标为:
(20,20); (20,140); (20,120); (20,1050); (20,220); (20,-300); (20,320); (20,1250)
对于输入文件中的第三行和任何进一步的三行集合也是如此。
代表每组三行的这 8 个值中的每一个的点应连接以形成折线图,similar to this one(但有 8 个折线图,而不是示例中的 4 个)。因此,同一张图上会有 8 个折线图,代表 X=10、X=20、X=30 等的值。
问题解答
我知道如何绘制一条线,例如plot(data[,1],data[,4],type="l")
但如何绘制多条线?
以及如何确保 Y 的 0 在正确的位置,以便 C5 的负值也可以正确绘制?
此外,我知道有 aggregate
函数可用于按类型 (A, B, C) 分组,但我不想执行任何汇总或平均操作,所以我可能正在寻找过滤器(按类型)而不是聚合?
我可能还想确保 C1 中不同值的数量与 C2 中的相同(纯粹是为了验证输入数据是否正确)。
考虑到您添加到 edit2 中的数据,我将再次解决您的问题。希望你能在这个解释后解决你的实际问题。
你说你从 csv 中读取的数据框:
df = data.frame(
c(10,130,"A",100,1000),
c(10,130,"B",200,-200),
c(10,130,"C",300,1200),
c(20,140,"A",120,1050),
c(20,140,"B",220,-300),
c(20,140,"C",320,1250),
c(30,120,"A",145,1130),
c(30,120,"B",255,1000),
c(30,120,"C",355,1110))
我们需要将其转置为列格式,您最初在 post 中提到过。
df = data.frame(t(df))
我按照您的示例命名该列:
names(df) = c("C1","C2","C3","C4","C5")
正在安装包并将其读取到 R:
install.packages("reshape2")
install.packages("ggplot2")
library(reshape2)
library(ggplot2)
melt
将您的数据重塑为有助于绘制图表的长格式。第一个变量 C4
和 C5
被转换为长格式,并重命名以在图中识别它们。
d1 = melt(df[,c(1,3:5)], id.vars = c("C1","C3"), measure.vars = c("C4","C5"), variable.name = "col")
d1$group = paste0(d1$C3,d1$col)
然后变量C1
和C2
在没有[A,B,C]
的情况下融化。
d2 = unique(melt(df[,c(1:2)], id.vars = "C1", measure.vars = c("C1","C2"), variable.name = "group"))
两个融化的数据集都按绘图所需的列组合。
p = rbind(d1[,c("C1","group","value")], d2[,c("C1","group","value")])
p$value = as.numeric(p$value)
您可以绘制,根据您创建的组为线条着色以识别它们,然后绘制标签以读取值。
ggplot(p, aes(x=C1, y=value, group=group, color=group, label=value)) +
geom_line() + geom_point() + geom_text(aes(label=value, hjust= 1, vjust=-1))