读取Fits数据及画图显示JAVA版

初学JAVA,没想到读取Fits,尤其是在MATLAB中一条命令搞定的显示数据,显得比较麻烦。这里用了两个包,分别完成读取及显示的功能。
读取Fits的头文件以及获取Table的数据: Java Library for access to FITS files
对于读取出来的波长和流量进行绘图: Plot Package,jahuwaldt.plot 
在他们类的基础上,参考他们给出的Demo,我稍微封装了一点,以方便以后的调用。

对jfits的封装,因为我主要读取文件只是获取其波长和流量的值,所以自己在那个基础上做了一个类

 

package org.eso.fits;

import java.io.IOException;
import java.util.ListIterator;

import org.eso.fits.FitsException;
import org.eso.fits.FitsFile;
import org.eso.fits.FitsHDUnit;
import org.eso.fits.FitsHeader;
import org.eso.fits.FitsKeyword;
import org.eso.fits.FitsMatrix;

public class LamostFits {
	public LamostFits() {
		// TODO Auto-generated constructor stub
	}

	public FitsFile GetFitsFile(String filePathString) {
		FitsFile file = null;

		try {
			System.out.println("new fits file");
			file = new FitsFile(filePathString);
		} catch (FitsException e) {
			System.out.println("Error: is not a FITS file >" + filePathString
					+ "<");
		} catch (IOException e) {
			System.out.println("Error: cannot open file >" + filePathString
					+ "<");
		}
		return file;

	}

	public int GetDataLength(FitsFile file) {
		FitsHDUnit hdu = file.getHDUnit(0);
		FitsMatrix dataMatrix = (FitsMatrix) hdu.getData();
		int[] dimSize = dataMatrix.getNaxis();
		return dimSize[0];
	}

	public int GetFlux(FitsFile file, float[] flux) {

		FitsHDUnit hdu = file.getHDUnit(0);
		FitsMatrix dataMatrix = (FitsMatrix) hdu.getData();
		int len = dataMatrix.getNaxis()[0];
		try {
			dataMatrix.getFloatValues(0, len, flux);
		} catch (FitsException e) {
			e.printStackTrace();
			return -1;
		}
		return len;
	}

	public void GetLambda(FitsFile file, float[] lambda) {
		FitsHDUnit hdu = file.getHDUnit(0);
		FitsHeader hdr = hdu.getHeader();
		ListIterator itr = hdr.getKeywords();

		double lambda_start = 0;
		double lambda_deta = 0;

		while (itr.hasNext()) {
			FitsKeyword kw = (FitsKeyword) itr.next();
			if (kw.getName().equals("CRVAL1")) {
				/*
				 * CRVAL1(R)= 3.5682 / Central wavelength (log10) of first pixel
				 * CD1_1(R)= 1.0E-4 / Log10 dispersion per pixel
				 */
				lambda_start = kw.getReal();
			} else if (kw.getName().equals("CD1_1")) {
				lambda_deta = kw.getReal();
			}
		}
		for (int i = 0; i < lambda.length; i++) {
			lambda[i] = (float) Math.pow(10, lambda_start + lambda_deta * i);
		}
	}

}


而对于数据的显示这块,同样,我想要有matlab那样,直接给出x,y的值,显示其曲线即可,重新定义了一个可以传递x,y参数的函数进行绘图。

 

 

package jahuwaldt.plot;

import java.awt.*;
import javax.swing.*;

public class PlotXY extends JFrame {

public static void PlotFits(float[] lambda, float[] flux, String title) {

		double[] xArr = new double[lambda.length];
		double[] yArr = new double[lambda.length];

		for (int i = 0; i < lambda.length; i++) {
			xArr[i] = (double) (lambda[i]);
			yArr[i] = (double) flux[i];

		}

		Plot2D aPlot = new SimplePlotXY(xArr, yArr, title, "Wavelength",
				"Flux", null, null, null);

		PlotPanel panel = new PlotPanel(aPlot);
		panel.setBackground(Color.white);

		PlotXY window = new PlotXY("SimplePlotXY Plot Window", panel);
		window.setSize(1000, 600);
		window.setLocation(100, 100);
		window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		window.show();

	}

}

 

具体的调用过程:

 

package org.eso.fits;

import jahuwaldt.plot.PlotXY;
import java.io.FileNotFoundException;

public class SpectraFits{

	public static void main(String[] argv) throws FileNotFoundException, FitsException {
		
    	LamostFits lamFits = new LamostFits();
    	String fitsname = "xxx";
    	String filenameString = "fitFiles/" + fitsname + ".fits";
    	FitsFile file = lamFits.GetFitsFile(filenameString);
    	int len = lamFits.GetDataLength(file);
    	float[] lambda = new float[len];
    	lamFits.GetLambda(file, lambda);
    	float[] flux = new float[len];
    	lamFits.GetFlux(file, flux);
    	
    	PlotXY.PlotFits(lambda, flux, fitsname);    
    }
}

显示结果:



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要读取fits文件中的光谱数据并用Python绘制光谱图,可以按照以下步骤进行: 1. 安装必要的Python库:首先要确保安装了`astropy`库,它是一个用于天文数据分析的强大工具,支持FITS文件的读取和操作。 2. 导入库和读取数据:在Python脚本中导入`astropy.io.fits`模块,并使用`astropy.io.fits.open()`函数打开FITS文件。使用`.data`属性可以获取光谱数据,保存为一个数组变量。 3. 绘制光谱图:使用`matplotlib`库的`pyplot`模块绘制光谱图。假设光谱数据保存在变量`flux`中,可以使用`pyplot.plot()`函数将光谱数据绘制出来。还可以添加标题、坐标轴标签等。 以下是一个简单示例代码: ```python import astropy.io.fits as fits import matplotlib.pyplot as plt # 打开并读取FITS文件 hdul = fits.open('your_file.fits') data = hdul[0].data # 绘制光谱图 plt.plot(data) plt.xlabel('波长') plt.ylabel('强度') plt.title('光谱图') plt.show() ``` 在实际使用中,可能需要对光谱数据进行一些预处理,如减去背景噪声、标定波长等。这些步骤根据具体需求可能会有所不同。但通过以上步骤,可以读取FITS文件中的光谱数据并使用Python绘制光谱图。 ### 回答2: 读取FITS文件光谱数据并绘制光谱图可以使用Python中的astropy库来实现。astropy是一个专门用于天文数据处理的Python库,可以方便地读取和处理FITS文件。 首先,我们需要安装astropy库。使用以下命令来安装: ```python pip install astropy ``` 接下来,我们可以编写以下代码来读取FITS文件并绘制光谱图: ```python import numpy as np import matplotlib.pyplot as plt from astropy.io import fits # 读取FITS文件 hdul = fits.open('光谱.fits') data = hdul[0].data # 获取光谱数据 wavelength = data['Wavelength'] # 波长数据 flux = data['Flux'] # 光谱强度数据 # 绘制光谱图 plt.plot(wavelength, flux) plt.xlabel('Wavelength') # 设置横轴标签 plt.ylabel('Flux') # 设置纵轴标签 plt.title('Spectrum') # 设置图像标题 plt.show() ``` 在上述代码中,我们首先使用`fits.open()`函数打开FITS文件,并使用`data`属性获取光谱数据。其中,`data['Wavelength']`获取到光谱的波长数据,`data['Flux']`获取到光谱的强度数据。 接下来,我们使用`matplotlib.pyplot.plot()`函数绘制光谱图,将波长作为横轴,光谱强度作为纵轴。然后使用`xlabel()`、`ylabel()`和`title()`分别设置横轴标签、纵轴标签和图像标题。 最后,使用`show()`函数显示绘制的光谱图。 以上是使用Python读取FITS文件光谱数据并绘制光谱图的基本步骤。根据具体的数据结构和需求,您可能需要进行一些额外的数据处理和图像调整。 ### 回答3: 读取FITS(Flexible Image Transport System)文件中的光谱数据,并使用Python绘制光谱的步骤如下: 1. 导入所需的Python库。首先需要导入astropy库来读取FITS文件的光谱数据,并导入matplotlib库来绘制光谱图形。 2. 使用astropy库读取FITS文件。可以使用astropy.io.fits的open函数来打开FITS文件,并使用该函数的getdata方法来获取光谱数据。将其存储在一个变量中以供后续使用。 3. 绘制光谱图形。使用matplotlib库的plot函数来绘制光谱图形。将步骤2中获取到的光谱数据作为plot函数的参数,即可绘制出光谱图形。 4. 添加图像标签和标题。使用matplotlib库的xlabel、ylabel和title函数来添加图像的x轴标签、y轴标签和标题。可以根据实际情况设置标签和标题的内容,以便更好地解释光谱数据。 5. 显示图形。使用matplotlib库的show函数来显示绘制好的光谱图形。 下面是一个简单的示例代码: ``` import matplotlib.pyplot as plt from astropy.io import fits # 读取FITS文件 hdul = fits.open('光谱.fits') data = hdul[0].data # 绘制光谱图形 plt.plot(data) # 添加图像标签和标题 plt.xlabel('波长') plt.ylabel('强度') plt.title('光谱数据') # 显示图形 plt.show() ``` 请注意,以上示例代码仅为演示如何读取FITS文件的光谱数据并绘制光谱图形的基本过程,具体操作和绘图效果可以根据实际需求进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值