ggplot2多光谱曲线绘制异常求助:melt操作导致绘图不符合预期
问题分析与解决方案
嘿,我来帮你找出操作里的问题,其实就是两个关键细节没处理对:
1. 数据融化(melt)的逻辑错误
你把id.vars设成了NULL,这会把所有列都当成要融化的数值列,包括第一列的波数。结果就是波数和各个强度值被混在了一起,每一行只存了列名和对应的值,完全丢失了“波数→强度值”的对应关系,这根本没法用来画随波数变化的曲线。
正确的做法是把第一列的波数作为id变量(也就是保留这个列不被融化,作为每条曲线的x轴基准),只把col1/col2/col3作为要融化的强度列。假设你原数据第一列的列名是Wavenumber(如果不是,替换成实际列名就行),代码应该是这样:
library(data.table) library(ggplot2) # 转换为data.table df <- data.table(Set) # 正确的melt操作:保留波数列,融化强度列 melted <- melt(df, id.vars = "Wavenumber", # 保留波数作为基准列 measure.vars = c("col1", "col2", "col3"), # 要融化的强度列 variable.name = "Curve", # 给新的分组列起个清晰的名字 value.name = "Intensity") # 给强度值列起名字
2. ggplot的映射关系错误
你之前的绘图代码里,把x映射成了wavelength列(这是原来的列名,比如col1/col2/Wavenumber),这就导致x轴显示的是离散的列名,而不是连续的波数;同时你没有按曲线分组,所以每个列名对应一堆值,画出来自然是垂直线。
正确的绘图应该把x映射成波数列,y映射成强度值,再用color或者group按曲线分组,代码如下:
ggplot(melted, aes(x = Wavenumber, y = Intensity, color = Curve)) + geom_line() + # 按分组画曲线 theme_classic() + xlim(3600, 8000) # 设置你需要的x轴范围
这样就能得到三条随波数变化的曲线,x轴也会显示3600-8000的连续波数啦~
内容的提问来源于stack exchange,提问作者Screamh
相关产品推荐
相关产品推荐

