import os
from astropy.io import fits
import numpy as np
import matplotlib.pyplot as plt
def dictSortByKeys(dict):
"""
输入一个字典,按键的大小将字典进行从小到大排序并返回新的字典
:return:
"""
sortedList = sorted(dict.items(), key=lambda x: x[0], reverse=False)
dict = {i[0]: i[1] for i in sortedList}
return dict
def dictSortByKValues(dict):
"""
输入一个字典,按值的大小将字典进行从小到大排序并返回新的字典
:return:
"""
sortedList = sorted(dict.items(), key=lambda x: x[1], reverse=False)
dict = {i[0]: i[1] for i in sortedList}
return dict
def findDictKeysByValue(dict, values):
"""
:param dict: 输入一个字典
:param values: 输入这个字典中你想找到对应键的值
:return: 返回对应的键
"""
valueKeyDict = {i[1]: i[0] for i in dict.items()}
return valueKeyDict[values]
def maxPoint(data):
"""
找一个二维矩阵的最大值以及最大值所在的行与列
"""
maxValue = data.max()
maxPoint = np.where(data == maxValue)
maxPointRow = maxPoint[0][0]
maxPointColumn = maxPoint[1][0]
return (maxPointRow, maxPointColumn)
class PlotGradient():
def __init__(self, data, row, column):
self.data = data
self.maxRow, self.maxColumn = row,column
def __iter__(self):
return self
def __next__(self):
data = self.data
shape = data.shape
maxPointRow = self.maxRow
maxPointColumn = self.maxColumn
nextPonitCoord = {"center": [maxPointRow, maxPointColumn]
, "left": [maxPointRow, maxPointColumn - 1]
, "lefttop": [maxPointRow - 1, maxPointColumn - 1]
, "top": [maxPointRow - 1, maxPointColumn]
, "righttop": [maxPointRow - 1, maxPointColumn + 1]
, "right": [maxPointRow, maxPointColumn + 1]
, "rightbottom": [maxPointRow + 1, maxPointColumn + 1]
, "bottom": [maxPointRow + 1, maxPointColumn]
, "leftbottom": [maxPointRow + 1, maxPointColumn - 1]
}
nextPonitValues = {"center": data[maxPointRow, maxPointColumn]
, "left": data[maxPointRow, maxPointColumn - 1]
, "lefttop": data[maxPointRow - 1, maxPointColumn - 1]
, "top": data[maxPointRow - 1, maxPointColumn]
, "righttop": data[maxPointRow - 1, maxPointColumn + 1]
, "right": data[maxPointRow, maxPointColumn + 1]
, "rightbottom": data[maxPointRow + 1, maxPointColumn + 1]
, "bottom": data[maxPointRow + 1, maxPointColumn]
, "leftbottom": data[maxPointRow + 1, maxPointColumn - 1]
}
centerValue = nextPonitValues["center"] # 中心值
sortedValues = sorted(nextPonitValues.values()) # 按照值从大到小的顺寻将字典中9个元素进行排序
centerValueIndex = sortedValues.index(centerValue) # 获得中心值在数值构成的列表中的索引
nextValuesIndex = centerValueIndex - 1 # 我们要找的是仅小于中心值的那个值,在这里获得它索引
# print(nextValuesIndex)
nextValue = sortedValues[nextValuesIndex] # 仅小于中心值的值
nextValuekey = findDictKeysByValue(nextPonitValues, nextValue) # 通过这个仅小于中心值的数来找到它在中心值得什么位置
nextRow, nextColumn = nextPonitCoord[nextValuekey] # 返回仅小于中心值的数的坐标(行,列)
self.maxRow, self.maxColumn = nextRow, nextColumn
if self.maxRow == 1 or self.maxColumn == 1 or self.maxRow == shape[0] - 1 or self.maxColumn == shape[
1] - 1 or centerValueIndex == 0:
raise StopIteration()
# print(nextRow, nextColumn)
return nextRow, nextColumn
if __name__ == "__main__":
with fits.open('Mrk501.fits') as hdul:
data = hdul[0].data
shape = data.shape
data = data.reshape([shape[2], shape[3]])
maxRow, maxColumn = maxPoint(data)
point = list(PlotGradient(data, maxRow, maxColumn))
fig, ax = plt.subplots()
ax.imshow(data, cmap='nipy_spectral_r', origin='lower')
x = [maxColumn]
y = [maxRow]
for i in point:
x.append(i[1])
y.append(i[0])
ax.plot(x, y)
ax.scatter(x, y, s=2, c='white')
plt.show()