首页 > 解决方案 > 等高线图中的颜色未映射到级别,而是映射到其他一些参数 [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 根据质量值映射各种轮廓?

标签: pythonmatplotlibplotcolorscontour

解决方案


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

请注意,colors=参数 ofplt.contour需要一对额外的方括号,因为代码在区分单个 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()

推荐阅读