Python數(shù)據(jù)展示 - 生成表格圖片
前言
前一篇文章介紹了推送信息到企業(yè)微信群里,其中一個(gè)項(xiàng)目推送的信息是使用Python自動(dòng)生成的表格,本文來講講如何用Python生成表格圖片。
選一個(gè)合適庫
Python最大的優(yōu)點(diǎn)就是第三方庫豐富,基本你要什么功能,都能找到別人實(shí)現(xiàn)好的庫,幾行代碼一調(diào)用就完事了。
Pytable
項(xiàng)目地址:https://github.com/HiroshiARAKI/pytable
最先找到的是日本人開發(fā)的pytab庫,它是基于matplotlib來畫圖的,默認(rèn)參數(shù)下生成的表格外觀一般般,而且顯示不了中文字符,字體也很小,效果不理想。
我一開始還抱著死磕的心態(tài),把這個(gè)庫的源碼下載下來魔改,改了字體和大小,生成的表格終于能看了,但排版還是會(huì)出各種奇奇怪怪的問題,比如文字溢出單元格之類的,心累……
Plotly
官網(wǎng)地址:https://plotly.com/
后面找到了一個(gè)新的庫:plotly,官網(wǎng)的介紹是:
The front end for ML and data science models
專門為機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)設(shè)計(jì)的前端展示工具,單純拿來畫表格還算大材小用了~ 它是用網(wǎng)頁來渲染的,看例子效果還可以,我就換成這個(gè)plotly試試,嗯,真的可以,那就這個(gè)了。
本文會(huì)分別介紹這兩個(gè)庫的使用,包括我魔改了pytab的地方。
(不過還是推薦plotly,網(wǎng)頁渲染就是好)
pytab
首先安裝
pip?install?pytab
然后我把畫表格的代碼封裝成一個(gè)函數(shù)
import?uuid
from?typing?import?List,?Dict,?Optional,?Tuple
import?pytab
def?draw_table(data:?Dict[str,?list]):
????"""
????畫表格
????:param?data:?數(shù)據(jù)格式?{
????????'a':?[1.0,?2.1,?3.5,?4.0,?2.0,?1.0,?2.1,?3.5,?4.0,?2.0,?],
????????'b':?[5.7,?6.1,?7.2,?8.3,?1.2,?5.7,?6.1,?7.2,?8.3,?1.2,?],
????????}
????:return:
????"""
????#?設(shè)置字體,不然顯示不了中文
????pytab.plt.rcParams["font.sans-serif"]?=?["SimHei"]
????pytab.table(?
????????data=data,
????????data_loc='center',
????????#?th_type='dark',
????????th_c='#aaaaee',??#?設(shè)置表頭背景顏色
????????td_c='gray',??#?設(shè)置數(shù)據(jù)行背景顏色
????????table_type='striped',
????????figsize=(len(data.keys()),?int(len(data.values())?/?len(data.keys())?+?1)),
????????#?fontsize=18,
????)
????#?pytab.show()
????temp_file?=?os.path.join(tempfile.gettempdir(),?f'{uuid.uuid4().hex}.jpg')
????print(temp_file)
????pytab.save(temp_file)
????return?temp_file
按照注釋的這個(gè)數(shù)據(jù)格式,a和b是表頭列名,后面的數(shù)組是每一列的數(shù)據(jù),很好理解
{
????'a':?[1.0,?2.1,?3.5,?4.0,?2.0,?1.0,?2.1,?3.5,?4.0,?2.0,?],
????'b':?[5.7,?6.1,?7.2,?8.3,?1.2,?5.7,?6.1,?7.2,?8.3,?1.2,?],
}
畫出來的表格是這樣的

再來試試中文顯示會(huì)怎么樣
{
????'列1':?[1.0,?2.1,?3.5,?4.0,?2.0,?1.0,?2.1,?3.5,?4.0,?2.0,?],
????'列2':?[5.7,?6.1,?7.2,?8.3,?1.2,?5.7,?6.1,?7.2,?8.3,?1.2,?],
}
畫出來是這樣

有點(diǎn)丑吧,勉強(qiáng)能看
OK~ 關(guān)于pytab的就不多折騰了,畢竟上限就在這了
接下來看看plotly
plotly
首先安裝
pip?install?plotly
話不多說,老規(guī)矩,我又是寫成一個(gè)函數(shù)
import?uuid
from?typing?import?List,?Dict,?Optional,?Tuple
import?plotly.graph_objects?as?go
import?plotly.io?as?pio
def?draw_table(headers:?List[str],?cells:?List[list]):
????"""
????畫表
????:param?headers:?header=dict(values=['A?Scores',?'B?Scores'])
????:param?cells:?cells=dict(values=[[100,?90,?80,?90],?[95,?85,?75,?95]])
????:return:
????"""
????pio.kaleido.scope.default_width?=?len(','.join(headers))?*?20
????pio.kaleido.scope.default_height?=?250?+?len(cells[0])?*?20
????fig?=?go.Figure(data=[go.Table(header=dict(values=headers),?cells=dict(values=cells))])
????#?fig.show()
????image_file?=?os.path.join(tempfile.gettempdir(),?f'{uuid.uuid4().hex}.jpg')
????print('write?image?to',?image_file)
????fig.write_image(image_file)
????return?image_file
這次的參數(shù)格式更前面的pytab不一樣,要傳兩個(gè)參數(shù),都是數(shù)組類型
第一個(gè)是表頭,第二個(gè)數(shù)組是單元格
先來個(gè)例子試試
draw_table(['列A',?'列B'],?[[100,?90,?80,?90],?[95,?85,?75,?95]])
然后把上面函數(shù)代碼里的fig.show()注釋去掉,可以看到生成的表格圖片效果
運(yùn)行后可以發(fā)現(xiàn)自動(dòng)打開了瀏覽器,因?yàn)檫@個(gè)庫是使用網(wǎng)頁來渲染表格的,效果如下

效果比前面那個(gè)pytab好一些,哈哈~
OK,就這樣啦。
下次分享一些關(guān)于最近用Django開發(fā)后臺(tái)的。
參考資料
python用prettytable輸出漂亮的表格:https://linuxops.org/blog/python/prettytable.html Plotly關(guān)于表格的文檔:https://plotly.com/python/table/ Plotly關(guān)于導(dǎo)出圖片的文檔:https://plotly.com/python/static-image-export/ python將表格展示的數(shù)據(jù)生成圖片:https://www.jianshu.com/p/3bfbf1bf0699
