如何在python中绘制动态编程表 [英] How to draw dynamic programming table in python

查看:95
本文介绍了如何在python中绘制动态编程表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

用python绘制这样的动态程序的好方法是什么?

What is a good way to draw a dynamic programming such as this one (with the path) in python?

我有看起来在线,我看到 pygame ,但这真的是这种技术图纸的最佳选择吗?

I have looked online and I see pygame but is that really the best option for this sort of technical drawing?

一个选项可能是使用matplotlib,例如

One option might be to use matplotlib using something like

import matplotlib.pylab as plt
plt.figure()
col_labels=['col1','col2','col3']
row_labels=['row1','row2','row3']
table_vals=[[11,12,13],[21,22,23],[31,32,33]]

the_table = plt.table(cellText=table_vals,
                  colWidths = [0.1]*3,
                  rowLabels=row_labels,
                  colLabels=col_labels,
                  loc='center right')
plt.text(12,3.4,'Table Title',size=8)

plt.show()

如何在桌子上画线?

推荐答案

以下代码产生使用本机Matplotlib表对所需数字进行近似处理:

The following code yields an approximation of the figure you want, using native Matplotlib tables:

import matplotlib.pylab as plt
import numpy as np

def get_coord(table, irow, icol):
    # get coordinates of a cell. This seems to work, don't ask why.
    cell = table.get_celld()[irow+1,icol] # row 0 is column headers
    box = cell.get_bbox().get_points() # [[x0, y0],[x1, y1]]
    xc, yc = box.mean(axis=0) # get center
    return xc, yc

col_labels=['G','A','T','C','C']
row_labels= ['G','T','G','C','C']
table_vals= [
    ['x','','','',''],
    ['','','x','',''],
    ['x','','','',''],
    ['','','','x','x'],
    ['','','','x','x']]
line = [(0,0), (0,1), (1,2), (2,2), (3,3), (4,4)]    

# draw table
the_table = plt.table(cellText=table_vals,
    colWidths = [0.1]*len(col_labels),
    rowLabels=row_labels, colLabels=col_labels,
    cellLoc = 'center', rowLoc = 'center', bbox=[.1,.1,.8,.8])
plt.draw() # lay out table, so that cell coordinates are calculated

# look up line coordinates
x = []; y = []
for irow, icol in line:
    xc, yc = get_coord(the_table, irow, icol)
    x.append(xc)
    y.append(yc)

# draw line    
plt.plot(x, y, 'r', linewidth = 5, alpha=0.5)
plt.xlim([0,1])
plt.ylim([0,1])
plt.show()

结果:

请注意,结果并不是非常漂亮,例如,我无法弄清楚如何使用行标签更改列的宽度。还有一个问题,表格是在数字坐标中绘制的,而线是在数据坐标中绘制的,因此,如果放大该线,表格将不再重叠。我花了很长时间在这些表上苦苦挣扎,但我认为它们是相当可使用的PITA,因此很难理解所得到的代码。

Note that the result is not extremely beautiful, I could for example not figure out how to change the width of the column with row-labels. There is also the issue that the table is drawn in 'figure coordinates', while the line is drawn in 'data-coordinates', so if you zoom in the line and the table no longer overlap. I struggled for quite some time with these tables, but in my opinion they are quite a PITA to work with and the resulting code is hard to understand.

我的首选解决方案是手工绘制表格:

My preferred solution is to just draw the table by hand:

import matplotlib.pylab as plt
import numpy as np

col_labels=['G','A','T','C','C']
row_labels= ['G','T','G','C','C']
table_vals= [
    ['X','','','',''],
    ['','','X','',''],
    ['X','','','',''],
    ['','','','X','X'],
    ['','','','X','X']]
line = np.array([
    [0, 1, 2, 2, 3, 4],
    [0, 0, 1, 2, 3, 4]])    
ncol = len(col_labels)
nrow = len(row_labels)

# draw grid lines
plt.plot(np.tile([0, ncol+1], (nrow+2,1)).T, np.tile(np.arange(nrow+2), (2,1)),
    'k', linewidth=3)
plt.plot(np.tile(np.arange(ncol+2), (2,1)), np.tile([0, nrow+1], (ncol+2,1)).T,
    'k', linewidth=3)

# plot labels
for icol, col in enumerate(col_labels):
    plt.text(icol + 1.5, nrow + 0.5, col, ha='center', va='center')
for irow, row in enumerate(row_labels):
    plt.text(0.5, nrow - irow - 0.5, row, ha='center', va='center')

# plot table content
for irow, row in enumerate(table_vals):
    for icol, cell in enumerate(row):
        plt.text(icol + 1.5, nrow - irow - 0.5, cell, ha='center', va='center')

# plot line
plt.plot(line[0] + 1.5, nrow - line[1] - 0.5, 'r', linewidth = 5, alpha = 0.5)

plt.axis([-0.5, ncol + 1.5, -0.5, nrow+1.5])
plt.show()

具有结果:

这看起来好多了,代码也很容易理解。您可能要根据自己的喜好调整一些线宽和字体大小,然后隐藏轴。

This looks much nicer, and the code is straightforward to understand. You might want to adjust some line-widths and font-sizes to your own taste, and hide the axis.

这篇关于如何在python中绘制动态编程表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆