【问题标题】:Python/Matplotlib: Coloring cells in table based on customized/altered colormapPython/Matplotlib:基于自定义/更改的颜色图为表格中的单元格着色
【发布时间】:2023-04-10 22:41:01
【问题描述】:

我对 Matplotlib 的表格方面相当陌生,并且一直难以理解颜色图的功能。所以我在这里遗漏了一些简单的东西,我很抱歉......这不是故意的。

我希望创建一个表格来显示随机模型的乘法偏差值。这是一个关键方面,因为值的分布不是线性的——也不一定是指数的。例如,数据分布应该以 1 为中心,不低于零,理论上没有上限(尽管我将其限制在 10)。

因此,就颜色图而言,我需要颜色图以值“1”为中心,颜色图的一半着色值从 0 到 1,另一半着色值从 1 到 10。理想情况下,这将是“发散”颜色图,例如“bwr”(此处的示例:https://matplotlib.org/stable/tutorials/colors/colormaps.html),其中接近 1 的值是白色,(0 和 1)之间的值是各种蓝色,而(1 和 10)之间的值是各种深浅不一的红色。

我似乎无法解开如何将整个混乱的指令传递到 Matplotlib 中的“cellColours”参数中。我找到了有关如何使用颜色图来控制单元格颜色的有用示例(例如here),我正在尝试构建这些示例(见下文)。这确实将“bwr”颜色图粘附到表格上 - 但是,它在数据集上线性应用它,我似乎无法将我的大脑包裹起来以使颜色图遵守可能自定义的比例(0

有什么提示或建议吗?我是不是很傻,错过了一些清晰易懂的东西?

import numpy as np
import matplotlib
from matplotlib import cm
import matplotlib.pyplot as plt
from pandas import *

#Create sample dataset
idx = Index(np.arange(1,6))
df = DataFrame(abs(2*np.random.randn(5, 5)), index=idx, columns=['A', 'B', 'C', 'D', 'E'])
#print(df)
vals = np.around(df.values,2)
print(vals)

##Create list of customized levels--linear from 0 to 1, then linear from 1 to 10--with
##granularity to match 256 entry colormap.
##Do I do something with this?
firstlist = np.linspace(0, 1, num=128)
secondlist = np.linspace(1.05,10,num=127)
levels = np.concatenate((firstlist, secondlist), axis=0)

norm = plt.Normalize(0,10)
colours = plt.cm.bwr(norm(vals)) #Linear normalization of the colormap, which isn't what is desired.

fig = plt.figure(figsize=(15,8))
ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[])
the_table=plt.table(cellText=vals, rowLabels=df.index, colLabels=df.columns,
                    loc='center', cellColours=colours)

plt.savefig('test_table.png')

【问题讨论】:

  • 您想要具有不同边界的自定义 cmap。尝试,例如this link.

标签: python pandas numpy matplotlib


【解决方案1】:

啊,明白了。

原来它只是应用 matplotlib.colors.TwoSlopeNorm() 函数来创建标准化。

因此,新代码如下所示:

import numpy as np
import matplotlib
from matplotlib import cm
import matplotlib.pyplot as plt
from pandas import *

#Create sample dataset
idx = Index(np.arange(1,6))
df = DataFrame(abs(2*np.random.randn(5, 5)), index=idx, columns=['A', 'B', 'C', 'D', 'E'])
#print(df)
vals = np.around(df.values,2)
print(vals)

##Create list of customized levels--linear from 0 to 1, then linear from 1 to 10--with
##granularity to match 256 entry colormap.
##Do I do something with this?
firstlist = np.linspace(0, 1, num=128)
secondlist = np.linspace(1.05,10,num=127)
levels = np.concatenate((firstlist, secondlist), axis=0)

#norm = plt.Normalize(0,10) #NO
norm = matplotlib.colors.TwoSlopeNorm(vmin=0,vcenter=1,vmax=10) #YES
colours = plt.cm.bwr(norm(vals))

fig = plt.figure(figsize=(15,8))
ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[])
the_table=plt.table(cellText=vals, rowLabels=df.index, colLabels=df.columns,
                    loc='center', cellColours=colours)

plt.savefig('test_table.png')

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 2012-07-10
    • 1970-01-01
    • 2015-01-24
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    相关资源
    最近更新 更多