如何从 matshow 二维绘图中删除 NaN 值并将标签格式设置为百分比

How to remove NaN values from matshow 2D plot and format labels as percentages

我正在将一些二维数组数据绘制为带有色标的地图,并且我有一些不想显示的 NaN 值。我需要将这些值显示为纯白色方块,并将格式设置为百分比样式。这是我目前所拥有的:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

filename = "data.csv"

df = pd.read_csv(filename, header=None)

fig, ax = plt.subplots()
ax.matshow(df, cmap='bwr')

for (i, j), z in np.ndenumerate(df):
    ax.text(j, i, '{:0.1f}'.format(z), ha='center', va='center',
            bbox=dict(boxstyle='round', facecolor='white', edgecolor='0.3'))

plt.show()

这是我的数据:

...这是我现在得到的。这几乎正​​是我想要的,除了那些 NaN 值和百分比格式。

非常感谢任何帮助。

  • if-else 块格式化文本字符串。
    • nan 只能用 np.isnan
    • 检查
    • 请参阅 for additional information about f-string 格式设置。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# sample data
np.random.seed(365)
df = pd.DataFrame(np.random.random((4, 4)))
df.iloc[2, -1] = np.nan
df.iloc[3, 2:] = np.nan

# plot
fig, ax = plt.subplots()
ax.matshow(df, cmap='bwr')

for (i, j), z in np.ndenumerate(df):
    if np.isnan(z):
        z = ''  # if z is nan make it an empty string
    else:
        z = f'{z*100:0.1f}%'  # otherwise multiply by 100 and string format
    ax.text(j, i, z, ha='center', va='center',
            bbox=dict(boxstyle='round', facecolor='white', edgecolor='0.3'))

plt.show()