如何在同一组轴上的不同范围内融合和绘制多个数据集?
How to melt and plot multiple datasets over different ranges on the same set of axis?
这是我第一次在这里发帖,我希望我的问题是清楚和恰当的。我有一组数据,其头部如下所示:
wl ex421 wl ex309 wl ex284 wl ex347
1 431 0.6168224 321 0.1267943 301 0.06392694 361 0.15220484
2 432 0.6687435 322 0.2416268 302 0.05631659 362 0.08961593
3 433 0.6583593 323 0.4665072 303 0.05327245 363 0.13134187
4 434 0.6832814 324 0.3576555 304 0.00000000 364 0.32432432
5 435 0.6427830 325 0.2194976 305 0.12328767 365 0.50308203
6 436 0.7393562 326 0.1866029 306 0.08675799 366 0.34660977
等等。 'wl' 列代表波长,有四个不同的范围。其他四列表示在 'wl' 范围内进行的测量(标准化)。范围也有不同的长度。它们都在数据集中间的某个地方部分重叠。
我需要实现的是在同一组轴上显示所有四组 'ex###' 数据并绘制在各自范围内的图。 x 轴需要容纳所有四个 'wl' 范围。但是,我还没有成功。
过去,当我不得不像这样绘制多组数据时,我只是融化了数据,它总是有效的。像这样:
df_melt <- melt(df, id.var = 'wl')
然后我会这样绘制:
fluor_plt <- ggplot(fluor_ref2_melt, aes(x=wl,y=value,color=variable)) +
geom_point(shape = 1, fill = NA) + geom_path(data = fluor_ref2_melt,size = 1) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
scale_colour_manual(values = colvec)
但是,因为我有多个名称为 'wl' 的列,它们也有不同的范围,所以 R 只采用第一个 'wl' 列并丢弃所有其他列。然后它基本上通过使用行索引将所有 'ex###' 值移动到该范围内......所以我得到了下面的框架图:
wl ex421 ex309 ex284 ex347
1 431 0.6168224 0.1267943 0.06392694 0.15220484
2 432 0.6687435 0.2416268 0.05631659 0.08961593
3 433 0.6583593 0.4665072 0.05327245 0.13134187
4 434 0.6832814 0.3576555 0.00000000 0.32432432
5 435 0.6427830 0.2194976 0.12328767 0.50308203
6 436 0.7393562 0.1866029 0.08675799 0.34660977
不用说,这完全是错误的...
因此,我试图规避该问题的一种方法是进入 Excel 并手动上下移动列,以便在数据框中每一行对应一个 'wl' 值,无论是否有任何测量值与它与否。这摆脱了 'shifted' 的值,但 R 仍然丢弃第一列之后的 'wl' 列。我没有得到一个完全错误的情节,而是得到了正确情节的一部分。第一组观察值 (ex421) 绘制在其整个范围内;在范围重叠的地方可以看到其他的碎片。
我看过一些过去在这里被问及的类似案例,例如 - Reshape data frame from wide to long with re-occuring column names in R。
但我是 R 的新手,我认为我无法完全理解所提出的解决方案。我没有成功地按照我希望的方式重塑我的数据(为不同的集合保留不同的 'wl' 范围)并且我不知道之后要给 ggplot 哪些参数。我试过使用 data.table,但后来我不知道为 value.name 和 variable.name 赋予什么。
重申一下,我想要实现的是通过在 Excel 中制作单个散点图并向其添加四个不同的系列来绘制电子表格中的四个数据集。
如有任何意见,我们将不胜感激!
在这里,我用您的数据加载了一个数据框,确保允许使用 check.names = F
重复名称,否则它会将 wl
列重命名为不同的:
df <- read.table(
header = T, check.names = F,
stringsAsFactors = F,
text = " wl ex421 wl ex309 wl ex284 wl ex347
431 0.6168224 321 0.1267943 301 0.06392694 361 0.15220484
432 0.6687435 322 0.2416268 302 0.05631659 362 0.08961593
433 0.6583593 323 0.4665072 303 0.05327245 363 0.13134187
434 0.6832814 324 0.3576555 304 0.00000000 364 0.32432432
435 0.6427830 325 0.2194976 305 0.12328767 365 0.50308203
436 0.7393562 326 0.1866029 306 0.08675799 366 0.34660977")
那么这是一种重塑的方法,只需堆叠数据的子集。由于没有太多的列对,我认为 semi-manual 方法就可以了。它保留了不同的列 headers,因此我们可以 gather
将它们变成长格式并映射到您的图中的颜色。
library(tidyverse)
df2 <- bind_rows(
df[1:2],
df[3:4],
df[5:6],
df[7:8]
) %>%
gather(variable, value, -wl) %>%
drop_na()
ggplot(df2, aes(x=wl,y=value,color=variable)) +
geom_point(shape = 1, fill = NA) +
geom_path(size = 1) +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
我能想到这个解决方案:
# data:
dt <- structure(list(wl = 431:436,
ex421 = c(0.6168224, 0.6687435, 0.6583593, 0.6832814, 0.642783, 0.7393562),
wl = 321:326,
ex309 = c(0.1267943, 0.2416268, 0.4665072, 0.3576555, 0.2194976, 0.1866029),
wl = 301:306,
ex284 = c(0.06392694, 0.05631659, 0.05327245, 0, 0.12328767, 0.08675799),
wl = 361:366,
ex347 = c(0.15220484, 0.08961593, 0.13134187, 0.32432432, 0.50308203, 0.34660977)),
row.names = c(NA, -6L),
class = c("data.table", "data.frame"))
# get vectors with wl names
wls <- grep("wl", names(dt))
# get vectors with ex_numbers names
exs <- grep("ex", names(dt))
# reformat the data:
newDt <- cbind(stack(dt, select = wls), stack(dt, select = exs))
# Assign reasonable names:
names(newDt) <- c("wlNumber", "wlInd", "exValue", "exNumber")
现在可以使用任何命令绘制数据:
ggplot(newDt, aes(x = wlNumber, y = exValue, color = exNumber))+geom_point()+geom_line()
这种方法的主要优点是您可以将 table 分布到许多列中。没关系,只要他们的名字 有 "wl" 就可以了("ex" 代表其他变量)。
这是我第一次在这里发帖,我希望我的问题是清楚和恰当的。我有一组数据,其头部如下所示:
wl ex421 wl ex309 wl ex284 wl ex347
1 431 0.6168224 321 0.1267943 301 0.06392694 361 0.15220484
2 432 0.6687435 322 0.2416268 302 0.05631659 362 0.08961593
3 433 0.6583593 323 0.4665072 303 0.05327245 363 0.13134187
4 434 0.6832814 324 0.3576555 304 0.00000000 364 0.32432432
5 435 0.6427830 325 0.2194976 305 0.12328767 365 0.50308203
6 436 0.7393562 326 0.1866029 306 0.08675799 366 0.34660977
等等。 'wl' 列代表波长,有四个不同的范围。其他四列表示在 'wl' 范围内进行的测量(标准化)。范围也有不同的长度。它们都在数据集中间的某个地方部分重叠。 我需要实现的是在同一组轴上显示所有四组 'ex###' 数据并绘制在各自范围内的图。 x 轴需要容纳所有四个 'wl' 范围。但是,我还没有成功。
过去,当我不得不像这样绘制多组数据时,我只是融化了数据,它总是有效的。像这样:
df_melt <- melt(df, id.var = 'wl')
然后我会这样绘制:
fluor_plt <- ggplot(fluor_ref2_melt, aes(x=wl,y=value,color=variable)) +
geom_point(shape = 1, fill = NA) + geom_path(data = fluor_ref2_melt,size = 1) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
scale_colour_manual(values = colvec)
但是,因为我有多个名称为 'wl' 的列,它们也有不同的范围,所以 R 只采用第一个 'wl' 列并丢弃所有其他列。然后它基本上通过使用行索引将所有 'ex###' 值移动到该范围内......所以我得到了下面的框架图:
wl ex421 ex309 ex284 ex347
1 431 0.6168224 0.1267943 0.06392694 0.15220484
2 432 0.6687435 0.2416268 0.05631659 0.08961593
3 433 0.6583593 0.4665072 0.05327245 0.13134187
4 434 0.6832814 0.3576555 0.00000000 0.32432432
5 435 0.6427830 0.2194976 0.12328767 0.50308203
6 436 0.7393562 0.1866029 0.08675799 0.34660977
不用说,这完全是错误的... 因此,我试图规避该问题的一种方法是进入 Excel 并手动上下移动列,以便在数据框中每一行对应一个 'wl' 值,无论是否有任何测量值与它与否。这摆脱了 'shifted' 的值,但 R 仍然丢弃第一列之后的 'wl' 列。我没有得到一个完全错误的情节,而是得到了正确情节的一部分。第一组观察值 (ex421) 绘制在其整个范围内;在范围重叠的地方可以看到其他的碎片。 我看过一些过去在这里被问及的类似案例,例如 - Reshape data frame from wide to long with re-occuring column names in R。 但我是 R 的新手,我认为我无法完全理解所提出的解决方案。我没有成功地按照我希望的方式重塑我的数据(为不同的集合保留不同的 'wl' 范围)并且我不知道之后要给 ggplot 哪些参数。我试过使用 data.table,但后来我不知道为 value.name 和 variable.name 赋予什么。 重申一下,我想要实现的是通过在 Excel 中制作单个散点图并向其添加四个不同的系列来绘制电子表格中的四个数据集。
如有任何意见,我们将不胜感激!
在这里,我用您的数据加载了一个数据框,确保允许使用 check.names = F
重复名称,否则它会将 wl
列重命名为不同的:
df <- read.table(
header = T, check.names = F,
stringsAsFactors = F,
text = " wl ex421 wl ex309 wl ex284 wl ex347
431 0.6168224 321 0.1267943 301 0.06392694 361 0.15220484
432 0.6687435 322 0.2416268 302 0.05631659 362 0.08961593
433 0.6583593 323 0.4665072 303 0.05327245 363 0.13134187
434 0.6832814 324 0.3576555 304 0.00000000 364 0.32432432
435 0.6427830 325 0.2194976 305 0.12328767 365 0.50308203
436 0.7393562 326 0.1866029 306 0.08675799 366 0.34660977")
那么这是一种重塑的方法,只需堆叠数据的子集。由于没有太多的列对,我认为 semi-manual 方法就可以了。它保留了不同的列 headers,因此我们可以 gather
将它们变成长格式并映射到您的图中的颜色。
library(tidyverse)
df2 <- bind_rows(
df[1:2],
df[3:4],
df[5:6],
df[7:8]
) %>%
gather(variable, value, -wl) %>%
drop_na()
ggplot(df2, aes(x=wl,y=value,color=variable)) +
geom_point(shape = 1, fill = NA) +
geom_path(size = 1) +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
我能想到这个解决方案:
# data:
dt <- structure(list(wl = 431:436,
ex421 = c(0.6168224, 0.6687435, 0.6583593, 0.6832814, 0.642783, 0.7393562),
wl = 321:326,
ex309 = c(0.1267943, 0.2416268, 0.4665072, 0.3576555, 0.2194976, 0.1866029),
wl = 301:306,
ex284 = c(0.06392694, 0.05631659, 0.05327245, 0, 0.12328767, 0.08675799),
wl = 361:366,
ex347 = c(0.15220484, 0.08961593, 0.13134187, 0.32432432, 0.50308203, 0.34660977)),
row.names = c(NA, -6L),
class = c("data.table", "data.frame"))
# get vectors with wl names
wls <- grep("wl", names(dt))
# get vectors with ex_numbers names
exs <- grep("ex", names(dt))
# reformat the data:
newDt <- cbind(stack(dt, select = wls), stack(dt, select = exs))
# Assign reasonable names:
names(newDt) <- c("wlNumber", "wlInd", "exValue", "exNumber")
现在可以使用任何命令绘制数据:
ggplot(newDt, aes(x = wlNumber, y = exValue, color = exNumber))+geom_point()+geom_line()
这种方法的主要优点是您可以将 table 分布到许多列中。没关系,只要他们的名字 有 "wl" 就可以了("ex" 代表其他变量)。