等高线图中的颜色未映射到级别,而是映射到其他一些参数 [python]

Colors in contour map not mapped to levels but to some other parameter [python]

我正在为所有映射到同一级别的多个数据集绘制等高线图。因此,我希望 cmap 中的颜色不映射到级别上,而是映射到质量值上,质量值因各种数据集而异。我该怎么做?

我的代码结构如下:

import numpy as np
import pylab as plt
from pandas import DataFrame as df
import matplotlib.colors as colors
import scipy.interpolate as interpolate

#data is imported from files, made into columns using DataFrame and put in the array name 'data'

xi = np.linspace(1,10,1000)
yi = np.linspace(-1,1,1000)
X, Y = np.meshgrid(xi,yi)

for i in range(9):
    Z = interpolate.griddata((data[i]['q'], np.cos(data[i]['iota'])), data[i]['snr1'], (X,Y))
    cs = plt.contour(X,Y,Z,levels=[20])
    cs.collections[0].set_label(str(int(data[i]['mass'][0])))
plt.legend(loc=5, title='mass')

结果图是:

如何使用cmap根据质量值绘制各种等高线?

您需要创建一个颜色图对象和一个范数。颜色图对象将 0 到 1 之间的输入值转换为颜色值。范数是一个将最小值和最大值之间的值转换为 0,1 范围的函数。

请注意,plt.contourcolors= 参数需要一对额外的方括号,因为代码在区分单个 rgba 值和颜色数组时会混淆。

您的代码可能如下所示:

from matplotlib import pyplot as plt
import pandas as pd
import numpy as np
import scipy.interpolate as interpolate

#data is imported from files, made into columns using DataFrame and put in the array name 'data'

xi = np.linspace(1,10,1000)
yi = np.linspace(-1,1,1000)
X, Y = np.meshgrid(xi,yi)

cmap = plt.get_cmap('magma')
norm = plt.Normalize(0, max([data[i]['mass'][0] for i in range(9)]))

for i in range(9):
    Z = interpolate.griddata((data[i]['q'], np.cos(data[i]['iota'])), data[i]['snr1'], (X, Y))
    mass = data[i]['mass'][0]
    cs = plt.contour(X, Y, Z, levels=[20], colors=[cmap(norm(mass))])
    cs.collections[0].set_label(f'{mass:.0f}')
plt.legend(loc=5, title='mass')
plt.tight_layout()
plt.show()