emememem......
今天有个需求,需要读取两个csv文件然后依据数据的差异动态绘制出表格,然后搜了一圈利用Python的攻略,发现都无甚用,还是最终回到了Matplotlib的怀抱,发现网上讲解利用Matplotlib绘制表格的博文太少(PS:浪费了我很多时间),于是以本文记之。Pandas 中文手册Matplotlib 中文手册.cn
Python 可以利用Pandas来读取csv格式的文件,建议标准化csv文件(第一行为表头,或者省略表头),Pandas可以自动识别出数据的格式:obj(string),float,int
import pandas as pd
csv_cur = pd.read_csv(csv_cur_path,header=0) # 可以手动指定表头行
2. 设置图表的尺寸和分辨率,figsize长宽大小,dpi像素分辨率
plt.figure(figsize=(16, 8), dpi=100)
3. 设置表格的行总数,framedata通过iloc来索引每一个元素
row_len = len(csv_cur.iloc[:, 0])
4. 设置表头,framedata通过columns来获得表头行
col_list = list(csv_cur.columns)
5. 表格具体内容需要通过cellText来设置,每一个选项都是list[],表格从左上角开始定义(0,0,),包括表头,因此当设置colLabels时,表格内容设置需要避免覆盖第1行
# 表格的内容从第一行
for i in np.arange(row_len + 1):
for j in np.arange(col_len):
if i == 0:
the_table[i, j].get_text().set_fontsize(font_size)
the_table[i, j].get_text().set_color((0, 0, 0))
else:
the_table[i, j].get_text().set_fontsize(font_size)
the_table[i, j].get_text().set_color(table_colors[i - 1][j])
the_table = plt.table(cellText=table_vals,
cellLoc='center',
colWidths=col_widths,
colLabels=col_labels,
loc='center')
6. 由于表格内容和字体需要手动定义,因此需要手动指定表的列宽
col_len = len(col_list)
col_width = 0.65 / col_len
col_widths = [col_width * 1.3]
for i in np.arange(col_len - 1):
if csv_diff.iloc[0, i + 1] == 0:
col_widths.append(col_width * 0.7)
else:
col_widths.append(col_width)
7. 关掉图表的坐标轴并保存图片
plt.axis('off')
result = "visualize_slam_result_table.png"
plt.savefig(result)
plt.show()