我正在尝试使用ggplot2绘制光谱数据。我以下列形式获取数据:
到目前为止我的代码是:
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样本等我需要相同的颜色(一个样本的多次测量),但该图不起作用。当你放大时我得到一个看起来像这样的情节:
看起来ggplot2连接相同测量的两个样本/行,而不是分别绘制它们。有没有人有想法?我试图解决这个问题,因为...... ...
谢谢!
答案 0 :(得分:1)
这是我在Luke C的支持下获得的结果:
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)
答案 1 :(得分: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分组的样本的不同测量值,但根据样本名称保留颜色:
那是你想要的吗?
以下编辑
使用更大的数据集显示相同的方法:
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()
这将给出与上面相似的图,其中每个样本对于每个测量具有相同颜色的单独线。
如果我仍然想念你真正想要的东西,我道歉!