2017-04-17 166 views
2

我想使用ggplot2绘制光谱数据。我把我的数据在下面的表格:使用ggplot2绘制光谱数据

data structure

到目前为止我的代码是:

library(ggplot2) 
library(reshape2) 
melt_data <- melt(spectroscopic_data, id.vars = "sample_name", variable.name = "wavenumber", value.name = "intensity") 
melt_data$probe = factor(melt_data$probe) 
melt_data$wellenzahl = as.numeric(levels(melt_data$wellenzahl))[melt_data$wellenzahl] 
ggplot(melt_data, aes(x=wavenumber, y=intensity, group=sample_name, color=sample_name)) + geom_line() + 
scale_x_reverse(breaks=c(10000, 9500, 9000, 8500, 8000, 7500, 7000, 6500, 6000, 5500, 5000, 4500, 4000)) + 
scale_color_manual(values=c("#FF0000", "#0000CC", "#00CC00", "#FF00FF", "#FF9900", "#000000", "#999900", "#33FFFF", "#FFCCFF", "#FFFF00", "#999999", "#9933FF", "#993300", "#99FF33")) + 
theme_bw() + 
theme(legend.position = "bottom") + 
labs(x=expression(wavenumbers), y="intensity", colour = "") + 
theme(legend.text=element_text(size=10), axis.text=element_text(size=12), axis.title=element_text(size=14)) + 
guides(colour = guide_legend(ncol = 2, keywidth=1.5, keyheight=1, override.aes = list(size=1.8))) 

我需要为AAA级的样品,BBB-样本等相同的颜色(多次测量的样本),但情节不起作用。我得到一个情节,看起来像这样,当你放大:

zoom of current plot

它看起来像GGPLOT2连接同一测量的两个样品/线,而不是单独绘制它们。有人有想法吗?我正在努力解决这个问题,因为小时...

谢谢!

+1

欢迎堆栈溢出!这是一个坚实的第一个问题(我希望所有新问题都是这个质量)。如果你想参加[旅游],我会给你链接。如果您有更多问题,也可以转到[帮助]。 – Delioth

回答

0

一种方法是在重新设计样本之前将样本ID添加到数据框中。这将允许您保留名称,如“aaa”和“bbb”,但指定一个唯一的标识符作为您的分组变量(因为它不能区分同一个x变量中的两个观察值)。对于其中我试图模仿输入数据的例子:

ex<-cbind(c("aaa","aaa","bbb","bbb"), c(0.426,0.405,0.409,0.395), c(0.430,0.408,0.411,0.399), c(0.432,0.411,0.413,0.401)) 

ex<- as.data.frame(ex) 

colnames(ex) <- c("sample_name", "4000", "4004", "4008") 

ex$sample_id<-1:nrow(ex) 

melt <- melt(ex, id.vars = c("sample_name", "sample_id"), variable.name = "wavenumber", value.name = "intensity") 

ggplot(melt, aes(x = wavenumber, y = intensity, group = sample_id, color = sample_name)) + 
    geom_line() + 
    theme_classic() 

此输出用于由样本ID分组样品的不同的测量分离的线路,但保持颜色根据样品名:

enter image description here

那是你在追求什么?


编辑下面

要显示具有较大的数据集相同的方法:

alpha <-rep(sapply(letters[1:10], function(x) {paste(x,x,x, sep = "")}), each = 2) 
adf <- data.frame(alpha) 
adf$sample_id <- seq(1, (length(alpha))) 
adf$t <- rnorm(20, 0.4, 0.1) 

wavenum <- seq(4, 1503) 
for(i in wavenum){ 
    for(j in 1:length(alpha)){ 
    adf[j,i] <- adf[j,i-1] + (rnorm(1, 0.01, 0.01)) 
    } 
} 
adf[1:10, 1:10] 

anames <- c("sample_name", "sample_id", (1400 + 4 * seq(0, 1500))) 
names(adf)<-anames 

melt <- melt(adf, id.vars = c("sample_name", "sample_id"), variable.name = "wavenumber", value.name = "intensity") 

head(melt) 

ggplot(melt[1:1500,], aes(x = wavenumber, y = intensity, group = sample_id, color = sample_name)) + 
    geom_line(lwd = 1.5) + 
    theme_classic() 

这将给出类似的曲线,以上面的一个,其中,每个样本具有针对单个线每个测量都是相同的颜色。

enter image description here

如果我还在想你实际上是在后,我向你道歉什么!

+0

谢谢您的回复!由于我是R和ggplot2的新手,我不确定 - 但我认为你的方法可能不切实际,因为这些数据集很大(例如1500波数)。 也许问题是在该行 melt_data $波数= as.numeric(水平(melt_data $波数))[melt_data $波数] ??任何想法? –

+0

我不认为你的代码存在实际问题,除非你得到一个错误 - 我认为ggplot只是由于不知道如何分离两个具有相同名称的样本而受到限制。我会编辑我的答案,以显示我的方法使用更大的数据集,因为据我所知,在这种情况下(超出处理时间),大小应该不重要。 –

+0

再次感谢,我会尽快尝试使用我的数据,并且我会通知您!谢谢你到目前为止! –

1

这里是后卢克C'S真棒支持我的结果:

library(ggplot2) 
library(reshape2) 

melted_data <- melt(newtestdata, id.vars = c("sample_name", 
"sample_id"), variable.name = "wavenumber", value.name = "intensity") 

melted_data$wavenumber=as.numeric(levels(melted_data$wavenumber))[melted_data$wavenumber] 

ggplot(melted_data, aes(x=wavenumber, y=intensity, group = sample_id, color = sample_name)) + geom_line() + 
scale_x_reverse(breaks=c(1005, 1200, 1400), expand = c(0.01, 0.01)) + 
scale_y_continuous(breaks=c(0, 0.5, 1.0, 1.5, 2.0), expand = c(0.01, 0.01)) + 

scale_color_manual(values=c("#FF0000", "#0000CC", "#00CC00", "#FF00FF", "#FF9900", "#000000")) + 

theme_bw() + 
theme(legend.position = "bottom") + 
theme(plot.margin=unit(c(1,1,0.5,1),"cm")) + 

labs(x=expression(wavenumbers~"in"~cm^{"-1"}), y="absorbance in a.u.", colour = "") + 
theme(legend.text=element_text(size=10), axis.text=element_text(size=12), axis.title=element_text(size=14)) + 
guides(colour = guide_legend(ncol = 3, keywidth=1.5, keyheight=1, override.aes = list(size=1.2))) 

ggsave("buechi-all.pdf", width = 11.69, height = 8.27) 

Data Structure

Result