效果图镇楼
想看细节的可以一点点看,想Copy代码的,直接看下面代码部分
背景
最近在研究使用matplotlib直接从数据生成表格图片的实现方式。
进阶需求是把其中一列按百分比使背景色从左到右填充单元格,这里给出了一个可以用来解决问题的方法。
实现相关的技术点
- matplotlib绘制图表时的x,y是坐标轴里的x,y,并不是像素位置
- Table类有一个字典是用来保存行列元组和对应位置Cell的成员变量
- Cell类继承于Rectangle类,绘制的方式是绘制一个矩形然后填充下文字
- Rectangle类主要由左下角顶点在坐标系里的坐标,矩形的宽,矩形的高几个成员变量组成
- 每个Cell对象的左下角顶点坐标只有在最后保存图片进行绘制时才会去计算其位置(在执行object_of_cell.draw(renderer)之前)
- 可以通过object_of_cell.draw = MethodType(new_draw_method,object_of_cell)的方式指定object_of_cell这个对象的draw方法是new_draw_method
- Python中的对象可以动态增加成员变量
实现思路
利用技术点6和5,可以在绘制Cell的时候多绘制一个矩形出来作为百分比条,宽度可以通过技术点7来设置
实现步骤(不包含各种读取数据&生成Table对象的逻辑)
- 新写一个方法new_draw(self,renderer)作为绘制格子时的函数的逻辑,绘制原本的方框,利用原本的左下角顶点坐标绘制新的百分比填充的色块,最后填充文本
- 使用数据生成一个Table对象后,遍历其中Cell,对于符合条件的格子增加一个成员变量inner_width,保存百分比小格子的宽度,也就是当前格子宽度*这个格子保存的浮点数,区间[0,1],然后指定这个Cell对象的draw方法是上面新写的new_draw方法
- 最后保存的时候特殊格子调用的draw方法是我们新写的方法,就可以实现想要的功能了
实现代码
- new_draw方法的代码
def draw_processing_bar_cell(self, renderer):
if not self.get_visible():
return
# draw the rectangle
table_lib.Rectangle.draw(self, renderer)
# 绘制一个不完全填充整个格子的矩形,这里可以根据个人需求进行编码
old_width = self.get_width() # 这里需要记录下原来的宽度,等下文本的居中对齐会用这个宽度进行对齐,画完条要进行还原
self.set_width(self.inner_width)
if self.processing_bar_color is None:
self.processing_bar_color = '#FFDAB9'
self.set_facecolor(self.processing_bar_color)
self.set_alpha(0.5)
self.set_edgecolor(None)
patches.Rectangle.draw