<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python數(shù)據(jù)展示 - 生成表格圖片

          共 3116字,需瀏覽 7分鐘

           ·

          2022-04-10 12:32

          前言

          前一篇文章介紹了推送信息到企業(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


          瀏覽 170
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  草榴国产在线 | 麻豆传媒视频免费观看网站网址 | AV天堂成人电影 | 欧美熟妇激情一区二区三区 | 黄色大片操逼网站 |