【发布时间】:2021-10-27 17:50:08
【问题描述】:
让自己陷入困境。
我正在 Matplotlib 中创建一个基本表(通过 Pandas,但这不是问题)。我想要完成的是创建一个表,其中第一列(将是字符串值)保持白色......但第 2、3、4、5、6 列是浮动/整数,并将由自定义着色标准化颜色图。
我从基础开始,并通过下面的代码创建了“彩色”表。此时仅绘制具有整数值的列,请参见此处:
我最终需要做的是用一个额外的列来绘制它,比如在列“A”之前或在包含字符串值的列“F”之后,例如['MBIAS'、'RMSE'、'BAGSS'、'MBIAS'、'MBIAS']。
但是,如果我尝试将下面代码中的 cellColours 方法应用于混合了字符串列表和浮点/整数列表的表,它显然会失败。
是否有一种方法可以将 cellColours 方案仅应用于某些单元格或行/列?我可以循环遍历,将自定义颜色图应用到特定单元格吗?
任何帮助或提示将不胜感激!
代码:
import numpy as np
import matplotlib
from matplotlib import cm
import matplotlib.pyplot as plt
from pandas import *
#Create sample data in pandas dataframe
idx = Index(np.arange(1,6))
df = DataFrame(abs(2*np.random.randn(5, 5)), index=idx, columns=['A', 'B', 'C', 'D', 'E'])
model = ['conusarw', 'conusarw', 'conusarw', 'nam04', 'emhrrr']
df['Model'] = model
df1 = df[['A','B','C','D','E']]
test = df1.round({'A':2,'B':2,'C':2,'D':2,'E':2})
print(test)
vals = test.values
print(vals)
#Creates normalized list (from 0-1) based a user provided range and center of distribution.
norm = matplotlib.colors.TwoSlopeNorm(vmin=0,vcenter=1,vmax=10)
#Merges colormap to the normalized data based on customized normalization pattern from above.
colours = plt.cm.coolwarm(norm(vals))
#Create figure in Matplotlib in which to plot table.
fig = plt.figure(figsize=(15,8))
ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[])
#Plot table, using pandas dataframe information and data.
#Customized lists of data and names can also be provided.
the_table=plt.table(cellText=vals, rowLabels=model, colLabels=df.columns,
loc='center', cellColours=colours)
plt.savefig('test_table.png')
【问题讨论】:
-
数据框样式值得研究以备将来参考pandas.pydata.org/pandas-docs/stable/user_guide/style.html
标签: python-3.x pandas matplotlib