python – 使用Matplotlib的单个pcolormesh,带有多个colormap
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 使用Matplotlib的单个pcolormesh,带有多个colormap,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3005字,纯文字阅读大概需要5分钟。
内容图文
![python – 使用Matplotlib的单个pcolormesh,带有多个colormap](/upload/InfoBanner/zyjiaocheng/707/1b9b206306cc4d95bd5a037f06d8fd25.jpg)
我正在创建一个GUI,其中有几个记录(“事物”)和字段的实时“时间点”数据.记录可以根据字段进行比较,但字段不一定相关(至少不是相同的比例).对于我最终的GUI,我希望主页面是热图(实际上是一堆基于列(字段)的1-D热图,然后如果你点击一个,它将给出时间序列历史和一些其他图表.
无论如何,我在这里的目的是试图获得最初的热图以显示我想要的方式.到目前为止,我可以从Matplotlib获得pcolormesh,基本上通过黑客攻击和基于列的百分位数的热图来显示基于字段的单个1-D热图,然后在顶部添加实际值的文本.
但是,正如我所说,字段不一定相关,我希望能够为每个字段设置单独的色彩映射.例如:说第3和第4个字段在质量上彼此相关,但不与字段0-3相关 – 所以将那些映射为’greens’colormesh而不是’coolwarm’会很好.
这是我到目前为止的代码,并产生了pcolormesh / heatmap:
import pandas as pd
import matplotlib.pyplot as plt
def DFPercentiles(df,bycols=True):
p=pd.DataFrame(index=df.index,columns=df.columns)
if bycols!=True:
for j in df.index:
for i in df.columns:
p.loc[j,i]=(df.loc[j,i]-min(df.loc[j,:]))/(max(df.loc[j,:])-min(df.loc[j,:]))
else:
for i in df.index:
for j in df.columns:
p.loc[i,j]=(df.loc[i,j]-min(df.loc[:,j]))/(max(df.loc[:,j])-min(df.loc[:,j]))
return p
def Heatmap(df,figsize='auto'):
if figsize=='auto':
figsize=[shape(df)[1],shape(df)[0]/2]
fig=figure(figsize=figsize)
pdf=array(DFPercentiles(df,bycols=True)).astype(float)[::-1]
plt.pcolormesh(pdf,cmap=cm.coolwarm,alpha=0.8)
plt.yticks(arange(0.5,len(df)),df.index[::-1])
plt.xticks(arange(0.5,len(df.columns)),df.columns)
for y in range(df.shape[0]):
for x in range(df.shape[1]):
plt.text(x + 0.5, y + 0.5, '%.3f' % df[::-1].iloc[y, x],
horizontalalignment='center',
verticalalignment='center',
)
return plt
hmap=Heatmap(mydf)
hmap.show()
结果如下:
我没有运气试图为单独的字段获取多个色彩映射.
解决方法:
每个colormesh图都有一个与之关联的色彩图.为了在一个图表中使用多个色图,我看到以下选项:
>单个矩形:
不要使用pcolormesh,而是以您喜欢的颜色绘制单个矩形.
>创建自定义色彩映射,其中包含不同范围内的不同色彩映射.例如.从0到0.4的值映射到一个颜色映射的颜色,值从0.4到1映射到另一个颜色映射的颜色.这可能看起来像:
import matplotlib.pyplot as plt
import matplotlib.colors
import numpy as np
x,y = np.meshgrid(range(4), range(4))
z = np.array([[0.2,.3,.95],[.5,.76,0.4],[.3,.1,.6]]).astype(float)
mask= np.array([[1,0,0],[1,0,0],[1,1,1]]).astype(float)
Z = z + mask
c2 = plt.cm.Greens(np.linspace(0,1,128))
c1 = plt.cm.coolwarm(np.linspace(0,1,128))
cols = np.vstack((c1, c2))
cmap=matplotlib.colors.LinearSegmentedColormap.from_list("q", cols)
fig, ax=plt.subplots()
ax.pcolormesh(x,y,Z, vmin=0, vmax=2, cmap=cmap)
plt.show()
>掩盖阵列并绘制几个pcolormesh图.以下示例显示了这可能如何:
import matplotlib.pyplot as plt
import numpy as np
import numpy.ma as ma
x,y = np.meshgrid(range(4), range(4))
z = np.array([[1,1.3,3],[2.2,2.8,1.8],[3,1,3]]).astype(float)
mask= np.array([[1,0,0],[1,0,0],[1,1,1]]).astype(bool)
z1 = np.copy(z)
z1[mask] = np.nan
z2 = np.copy(z)
z2[~mask] = np.nan
fig, ax=plt.subplots()
ax.pcolormesh(x,y,ma.masked_invalid(z1), vmin=1, vmax=3, cmap="coolwarm")
ax.pcolormesh(x,y,ma.masked_invalid(z2), vmin=1, vmax=3, cmap="Greens")
plt.show()
内容总结
以上是互联网集市为您收集整理的python – 使用Matplotlib的单个pcolormesh,带有多个colormap全部内容,希望文章能够帮你解决python – 使用Matplotlib的单个pcolormesh,带有多个colormap所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。