Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自定义matplotlib绘图:带有彩色单元格的棋盘状表格_Python_Matplotlib_Pandas - Fatal编程技术网

Python 自定义matplotlib绘图:带有彩色单元格的棋盘状表格

Python 自定义matplotlib绘图:带有彩色单元格的棋盘状表格,python,matplotlib,pandas,Python,Matplotlib,Pandas,随着我学习python和这个有趣的绘图库,我开始使用matplotlib渲染绘图。我需要帮助为我正在处理的问题定制绘图。可能已经有一个内置函数用于此 问题: 我试图画一个表格(矩形)作为96个单独单元格(8行X 12列)的绘图。使用特定颜色为每个备选单元格着色(如棋盘:我将使用其他颜色组合,而不是黑/白),并从pandas数据框或python字典中为每个单元格插入值。在侧面显示列和行标签 样本数据: 我希望绘图看起来像这样,替换numpy/ds中单元格中的值 样地: 感谢您的意见 PS:你在ma

随着我学习python和这个有趣的绘图库,我开始使用matplotlib渲染绘图。我需要帮助为我正在处理的问题定制绘图。可能已经有一个内置函数用于此

问题: 我试图画一个表格(矩形)作为96个单独单元格(8行X 12列)的绘图。使用特定颜色为每个备选单元格着色(如棋盘:我将使用其他颜色组合,而不是黑/白),并从pandas数据框或python字典中为每个单元格插入值。在侧面显示列和行标签

样本数据:

我希望绘图看起来像这样,替换numpy/ds中单元格中的值

样地:

感谢您的意见


PS:你在mathplotlib的邮件列表上也发过同样的帖子吗?基本上,你可以使用
imshow
matshow

然而,我不太清楚你的意思

如果您想要一个棋盘,其中每个“白色”单元格由其他向量着色,您可以执行以下操作:

import matplotlib.pyplot as plt
import numpy as np

# Make a 9x9 grid...
nrows, ncols = 9,9
image = np.zeros(nrows*ncols)

# Set every other cell to a random number (this would be your data)
image[::2] = np.random.random(nrows*ncols //2 + 1)

# Reshape things into a 9x9 grid.
image = image.reshape((nrows, ncols))

row_labels = range(nrows)
col_labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
plt.matshow(image)
plt.xticks(range(ncols), col_labels)
plt.yticks(range(nrows), row_labels)
plt.show()

显然,这只适用于行数和列数为奇数的情况。对于行数和列数为偶数的数据集,可以迭代每一行

例如:

然而,每行中“数据”单元的数量将不同,这就是我被您的问题定义搞糊涂的地方

根据定义,棋盘格图案在每行中有不同数量的“白色”单元格。
您的数据可能在每行中都有相同数量的值。你需要定义你想做什么。您可以截断数据,也可以添加额外的列

编辑:我刚刚意识到只有奇数长度的列才是如此

不管怎样,我还是被你的问题弄糊涂了

您是否希望有一个“完整”的数据网格,并希望将数据网格中的“棋盘格”值模式设置为不同的颜色,还是希望使用绘制为某种恒定颜色的“棋盘格”值模式“点缀”数据

更新 听起来你想要更像一张宣传单的东西?Matplotlib对此并不理想,但您可以做到

理想情况下,您只需使用
plt.table
,但在这种情况下,直接使用
matplotlib.table.table
更容易:

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

from matplotlib.table import Table

def main():
    data = pandas.DataFrame(np.random.random((12,8)), 
                columns=['A','B','C','D','E','F','G','H'])
    checkerboard_table(data)
    plt.show()

def checkerboard_table(data, fmt='{:.2f}', bkg_colors=['yellow', 'white']):
    fig, ax = plt.subplots()
    ax.set_axis_off()
    tb = Table(ax, bbox=[0,0,1,1])

    nrows, ncols = data.shape
    width, height = 1.0 / ncols, 1.0 / nrows

    # Add cells
    for (i,j), val in np.ndenumerate(data):
        # Index either the first or second item of bkg_colors based on
        # a checker board pattern
        idx = [j % 2, (j + 1) % 2][i % 2]
        color = bkg_colors[idx]

        tb.add_cell(i, j, width, height, text=fmt.format(val), 
                    loc='center', facecolor=color)

    # Row Labels...
    for i, label in enumerate(data.index):
        tb.add_cell(i, -1, width, height, text=label, loc='right', 
                    edgecolor='none', facecolor='none')
    # Column Labels...
    for j, label in enumerate(data.columns):
        tb.add_cell(-1, j, width, height/2, text=label, loc='center', 
                           edgecolor='none', facecolor='none')
    ax.add_table(tb)
    return fig

if __name__ == '__main__':
    main()

我不清楚你在问什么。你想拥有一个“完整”的数据网格,并想在数据网格中设置一个不同颜色的“棋盘格”值模式,还是想用一个以恒定颜色绘制的“棋盘格”值模式“点缀”数据?乔:如果我理解你的意思,那么我想后者就是我想要的。只是解释一下,以确保我们在同一页上。绘制一个矩阵/表格(n x m),并为每个备用单元格上色,如excel工作表点所示。这种颜色是恒定的,不会因单元格的数值而改变。啊!示例图像使事情变得清晰。您需要的是类似excel的文本值表,而不是缩放图像。对不起,我弄糊涂了。回想起来,你想要的似乎很清楚,我只是误解了这个问题。乔:谢谢你让我开始。我从我的问题中理解你的困惑。下面是一个excel工作表快照示例。我想从numpy/pandas数据结构的单元格中绘制一个类似的图,输入值。乔:这太干净了,谢谢你的帮助。我还了解了如何一个单元格一个单元格地构建表格。对我的工作很有用。非常感谢……非常感谢你为我写了一个非常详细的答案。我还回答了一个类似的问题,我也从用户
unutbu
那里得到了一个很好的答案
import matplotlib.pyplot as plt
import numpy as np
import pandas

from matplotlib.table import Table

def main():
    data = pandas.DataFrame(np.random.random((12,8)), 
                columns=['A','B','C','D','E','F','G','H'])
    checkerboard_table(data)
    plt.show()

def checkerboard_table(data, fmt='{:.2f}', bkg_colors=['yellow', 'white']):
    fig, ax = plt.subplots()
    ax.set_axis_off()
    tb = Table(ax, bbox=[0,0,1,1])

    nrows, ncols = data.shape
    width, height = 1.0 / ncols, 1.0 / nrows

    # Add cells
    for (i,j), val in np.ndenumerate(data):
        # Index either the first or second item of bkg_colors based on
        # a checker board pattern
        idx = [j % 2, (j + 1) % 2][i % 2]
        color = bkg_colors[idx]

        tb.add_cell(i, j, width, height, text=fmt.format(val), 
                    loc='center', facecolor=color)

    # Row Labels...
    for i, label in enumerate(data.index):
        tb.add_cell(i, -1, width, height, text=label, loc='right', 
                    edgecolor='none', facecolor='none')
    # Column Labels...
    for j, label in enumerate(data.columns):
        tb.add_cell(-1, j, width, height/2, text=label, loc='center', 
                           edgecolor='none', facecolor='none')
    ax.add_table(tb)
    return fig

if __name__ == '__main__':
    main()