在python中绘制动态编程(如路径)的好方法是什么?
我已经在网上查看了pygame,但这真的是这种技术绘图的最佳选择吗?
一个选项可能是使用类似
之类的matplotlibimport 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()
如何在桌子上画线?
答案 0 :(得分:8)
以下代码使用原生Matplotlib表格得到您想要的图形的近似值:
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,结果代码很难理解。
我首选的解决方案是手工绘制表格:
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()
结果:
这看起来更好,代码很容易理解。您可能希望根据自己的喜好调整一些线宽和字体大小,并隐藏轴。