讓自己陷入了泡菜中。
我正在 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')
uj5u.com熱心網友回復:
除了快速向量化呼叫之外colours = plt.cm.coolwarm(norm(vals)),您還可以使用帶有 if-tests 的常規 Python 回圈。下面的代碼回圈遍歷各個行,然后遍歷各個元素并測驗它們是否為數字。類似的回圈準備四舍五入的值。速度不是真正的問題,除非你有成千上萬的元素。
(代碼使用import pandas as pd,因為import * from pandas不推薦。)
import matplotlib.pyplot as plt
from matplotlib.colors import to_rgba, TwoSlopeNorm
import pandas as pd
import numpy as np
# Create sample data in pandas dataframe
idx = pd.Index(np.arange(1, 6))
df = pd.DataFrame(abs(2 * np.random.randn(5, 5)), index=idx, columns=['A', 'B', 'C', 'D', 'E'])
df['Model'] = ['conusarw', 'conusarw', 'conusarw', 'nam04', 'emhrrr']
cmap = plt.cm.coolwarm
norm = TwoSlopeNorm(vmin=0, vcenter=1, vmax=10)
colours = [['white' if not np.issubdtype(type(val), np.number) else cmap(norm(val)) for val in row]
for row in df.values]
vals = [[val if not np.issubdtype(type(val), np.number) else np.round(val, 2) for val in row]
for row in df.values]
fig = plt.figure(figsize=(15, 8))
ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[])
the_table = plt.table(cellText=vals, rowLabels=df['Model'].to_list(), colLabels=df.columns,
loc='center', cellColours=colours)
plt.show()

PS:如果速度是一個問題,下面的代碼有點棘手。它用:
- 設定顏色圖的“壞顏色”
pd.to_numeric(..., errors='coerce')將所有字串轉換為 nans- as
pd.to_numeric()僅適用于一維陣列,ravel()并且reshape()被使用 - 使用相同的陣列,
np.where可以進行四舍五入
cmap = plt.cm.coolwarm.copy()
cmap.set_bad('white')
norm = TwoSlopeNorm(vmin=0, vcenter=1, vmax=10)
values = pd.to_numeric(df.values.ravel(), errors='coerce').reshape(df.shape)
colours = cmap(norm(values))
vals = np.where(np.isnan(values), df.values, np.round(values, 2))
fig = plt.figure(figsize=(15, 8))
ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[])
the_table = plt.table(cellText=vals, rowLabels=df['Model'].to_list(), colLabels=df.columns,
loc='center', cellColours=colours)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/339354.html
標籤:蟒蛇-3.x 熊猫 matplotlib
