python - 等高线图中的颜色未映射到级别,而是映射到其他一些参数 [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 根据质量值映射各种轮廓?
解决方案
您需要创建一个颜色图对象和一个规范。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()
推荐阅读
- javascript - Mocha 在输入字段中找不到 ID - react-native
- bootstrap-4 - 引导表,group-by-v2 插件在示例中不起作用
- log4j2 - Pattern Layout 用于缩写除最右边的 2 之外的所有记录器组件的名称
- javascript - if else 条件不在反应组件中评估
- c# - 派生类和基类的引用类型的区别
- tensorflow - 是否有一个 tensorflow keras 是一堆密集层的包装器?
- php - 没有任何插件的WordPress用户限制
- python - 根据地理参考多边形裁剪networkx图
- angular - 如何将 firebase 的 uid 读取为正常的显示名称?
- database - 如果我截断并重新填充表而不是删除/插入/更新插入,我是否还应该截断 postgresql 数据库?