当前位置:   article > 正文

pandas+plottable: 表格可视化从此再无敌手!

plottable

前言

大家好。

今天给大家分享一个专门可视化表格神器plottable库,结合pandas库在可视化表格方面可谓再无敌手。提供对应的python代码,干货满满。 如果对你有帮助,还请点赞关注转发~

老规矩,本文涉及的python库版本信息如下:

  1. # !pip install plottable==0.1.5  pyjanitor==0.26.0
  2. # !pip install mpl_font==1.1.0
  3. import numpy as np
  4. import pandas as pd
  5. import janitor
  6. import matplotlib
  7. print(f"pandas : {pd.__version__}")  #pandas: 2.2.0
  8. print("numpy:", np.__version__) #numpy: 1.26.3

本文目录

  • plottable库介绍

  • 绘图技巧总结

    • 列区域不同样式设置汇总

    • 小数数据类型显示不同格式汇总

    • 显示不同图标&&风格汇总

    • 对单元格和字体的用法介绍总结

  • 精美表格案例展示

    • 对表格数据显示进度条、五角星、百分比,使得数据展示精美直观

    • 将pandas的表格显示热力图

    • 为不同行配置不同颜色

  • 参考文档

plottable库介绍

plottable库(其官方github:https://github.com/znstrider/plottable)是专门可视化表格展示的神器,其底层是基于matplotlib开发的,展示效果惊艳,修改代码少,非常好用。

绘图技巧总结

今天将plottable库常用的显示核心语法汇总介绍给大家,并配置对应的案例代码。

列区域不同样式设置汇总

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. from plottable import ColumnDefinition, ColDef, Table
  5. from plottable.formatters import decimal_to_percent
  6. import mpl_font.noto
  7. from plottable.cmap import normed_cmap
  8. np.random.seed(2024)
  9. d = pd.DataFrame(np.random.random((55)), columns=["A""B""C""D""E"]).round(2)
  10. fig, ax = plt.subplots(figsize=(65))
  11. tab = Table(d,ax=ax
  12.             , column_definitions=[
  13.                 ColumnDefinition(name="index"
  14.                                  title="索引",
  15.                                  width=2, #设置单元空格的宽度
  16.                                  textprops={"ha""left""weight""bold"} #设置属性靠左,加粗
  17.                                 ),
  18.                 ColumnDefinition(name="A", title="Title A",formatter=decimal_to_percent),
  19.                 ColumnDefinition(name="B", title="梯度图"
  20.                                  , cmap=plt.cm.cool # 设置背景梯度图
  21.                                  ,text_cmap=plt.cm.Reds # 设置文字背景梯度图 
  22.                                 ,textprops={"ha""center"} #设置属性居中
  23.                                 ), 
  24.                 
  25.                 ColDef(name="C", group="对照组", formatter="{:.2e}"),
  26.                 ColumnDefinition(name="D",title='百分比', group="对照组",formatter="{:.1%}"),
  27.                 ColumnDefinition(
  28.                             name="E",
  29.                             width=0.75,
  30.                             textprops={
  31.                                 "ha""center",
  32.                                 "bbox": {"boxstyle""circle""pad"0.35},
  33.                             },
  34.                             cmap=normed_cmap(d["E"], cmap=plt.cm.winter, num_stds=2.5),
  35.                             group="实验组",
  36.                         ),
  37.                     ]
  38.            )
  39. plt.show()

可视化结果:

8063a4b8dae9b08734ec5201359efd51.png

小数数据类型显示不同格式汇总

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. from plottable import ColumnDefinition, ColDef, Table
  5. from plottable.formatters import decimal_to_percent
  6. import mpl_font.noto
  7. np.random.seed(2024)
  8. d = pd.DataFrame(np.random.random((55)), columns=["A""B""C""D""E"]).round(4)
  9. fig, ax = plt.subplots(figsize=(84))
  10. tab = Table(d, column_definitions=[ColDef(name="A", title="2 Decimals", formatter="{:.2f}"), 
  11.                                    ColDef(name="B", title="Percentage", formatter="{:.1%}"),
  12.                                    ColDef(name="C", title="Exponent\nNotation", formatter="{:.2e}")])
  13. plt.show()
  14. fig.savefig("demo.png", facecolor=ax.get_facecolor(), dpi=200)

输出结果:ea6e8fde4c19ecb94f3984f24a1e7f74.png

显示不同图标&&风格汇总

  1. !git clone  https://github.com/znstrider/plottable
  2. from pathlib import Path
  3. from plottable.plots import *
  4. path = list(Path("./plottable/docs/example_notebooks/country_flags").glob("*.png"))[0]
  5. import mpl_font.noto
  6. np.random.seed(2024)
  7. fig, axes = plt.subplots(1,7,figsize=(101))
  8. bars = percentile_bars(axes[0], val=72, color="#b0db7c", background_color="#f0f0f0", is_pct=False
  9.                        ,rect_kw={"lw"0.5,},)
  10. axes[0].set_title("条形进度条")
  11. image(axes[1], path)
  12. axes[1].set_title("矩形图片")
  13. im = circled_image(axes[2], path)
  14. axes[2].set_title("圆形图片")
  15. im = circled_image(axes[3], path, linewidth=2, visible=True, edgecolor="#999999")
  16. axes[3].set_title("边框圆形图片")
  17. b = bar(axes[4], 0.5, plot_bg_bar=True, cmap=plt.cm.cool, annotate=True, lw=1, height=0.35)
  18. axes[4].set_title("进度条")
  19. stars = percentile_stars(axes[5], 70, background_color="#f0f0f0")
  20. axes[5].set_title("五角星")
  21. donut = progress_donut(axes[6], 73, textprops={"fontsize"14})
  22. axes[6].set_title("仪表盘")
  23. plt.show()
  24. fig.savefig("demo.png", facecolor=ax.get_facecolor(), dpi=200)

输出结果:

f9b4e4446e2d08207bef8d9aad95f13a.png

对单元格和字体的用法介绍总结

  1. table.columns[column_name].set_facecolor("#f0f0f0")
  2. table.rows[0].set_facecolor("#f0f0f0")
  1. 单元格区域属性设置方法

  • set_alpha:设置透明度

  • set_color:设置填充颜色

  • set_edgecolor:设置边框颜色

  • set_facecolor:设置面(填充)颜色

  • set_fill:设置是否填充,即开启或关闭填充效果

  • set_hatch:设置填充图案样式(如斜线、点状等)

  • set_linestyle:设置边框线条样式

  • set_linewidth:设置边框线条宽度

  1. 字体属性设置方法

  • set_fontcolor:设置字体颜色

  • set_fontfamily:设置字体家族(字体类型)

  • set_fontsize:设置字体大小

精美表格案例展示

对表格数据显示进度条、五角星、百分比,使得数据展示精美直观

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. from matplotlib.colors import LinearSegmentedColormap
  5. import mpl_font.noto
  6. from plottable import ColumnDefinition, Table
  7. from plottable.formatters import decimal_to_percent
  8. from plottable.plots import bar, percentile_bars, percentile_stars, progress_donut
  9. # cmap = LinearSegmentedColormap.from_list(
  10. #     name="bugw", colors=["#ffffff""#f2fbd2""#c9ecb4""#93d3ab""#35b0ab"], N=256
  11. # )
  12. np.random.seed(2024)
  13. pf = pd.DataFrame(np.random.random((54)), columns=["A""B""C""D"]).round(2)
  14. pf.index.set_names("序号",inplace=True)
  15. fig, axes = plt.subplots(1,2,figsize=(10,5),dpi=100)
  16. Table(pf,ax=axes[0]
  17.             ,odd_row_color="#f0f0f0"
  18.             , even_row_color="#e0f6ff"
  19.            )
  20. axes[0].set_title("原始数据如下")
  21. Table(pf
  22.         ,ax=axes[1],
  23.         cell_kw={
  24.             "linewidth"0,
  25.             "edgecolor""k",
  26.         },
  27.         textprops={"ha""center"},
  28.         column_definitions=[
  29.             ColumnDefinition("index", textprops={"ha""left"}),
  30.             ColumnDefinition("A", plot_fn=percentile_bars, plot_kw={"is_pct": True}),
  31.             ColumnDefinition(
  32.                 "B", width=1.5, plot_fn=percentile_stars, plot_kw={"is_pct": True}
  33.             ),
  34.             ColumnDefinition(
  35.                 "C",
  36.                 plot_fn=progress_donut,
  37.                 plot_kw={
  38.                     "is_pct": True,
  39.                     "formatter""{:.0%}"
  40.                     },
  41.                 ),
  42.             ColumnDefinition(
  43.                 "D",
  44.                 width=1.25,
  45.                 plot_fn=bar,
  46.                 plot_kw={
  47.                     "cmap":  plt.cm.cool,
  48.                     "plot_bg_bar": True,
  49.                     "annotate": True,
  50.                     "height"0.5,
  51.                     "lw"0.5,
  52.                     "formatter": decimal_to_percent,
  53.                 },
  54.             ),
  55.         ],
  56. )
  57. axes[1].set_title("经过精美化后数据展示")
  58. plt.show()

输出结果:13e2f31d11dd29119ad1b3c505337d72.png

将pandas的表格显示热力图

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. from matplotlib.colors import LinearSegmentedColormap
  5. from plottable import ColDef, Table
  6. np.random.seed(2024)
  7. cities = [
  8.     "TORONTO",
  9.     "VANCOUVER",
  10.     "HALIFAX",
  11.     "CALGARY",
  12.     "OTTAWA",
  13.     "MONTREAL",
  14.     "WINNIPEG",
  15.     "EDMONTON",
  16.     "LONDON",
  17.     "ST. JONES",
  18. ]
  19. months = [
  20.     "1月","2月","3月","4月","5月","6月",
  21.     "7月""8月""9月""10月""11月""12月",
  22. ]
  23. # months = ["JAN","FEB","MAR","APR","MAY","JUN"
  24. #           ,"JUL","AUG","SEP","OCT","NOV","DEC",]
  25. data = np.random.random((1012)) + np.abs(np.arange(12) - 5.5)
  26. data = (1 - data / (np.max(data)))
  27. d = pd.DataFrame(data, columns=months, index=cities).round(2)
  28. fig, ax = plt.subplots(figsize=(145))
  29. column_definitions = [
  30.     ColDef(name, cmap=plt.cm.cool, formatter='{:.2f}'for name in months
  31. ] + [ColDef("index", title="", width=1.5, textprops={"ha""right"})]
  32. tab = Table(
  33.     d,
  34.     column_definitions=column_definitions,
  35.     row_dividers=False,
  36.     col_label_divider=False,
  37.     textprops={"ha""center"},
  38.     cell_kw={
  39.         "edgecolor""w",
  40.         "linewidth"0,
  41.     },
  42. )
  43. tab.col_label_row.set_facecolor("k")
  44. tab.col_label_row.set_fontcolor("w")
  45. tab.columns["index"].set_facecolor("k")
  46. tab.columns["index"].set_fontcolor("w")
  47. tab.columns["index"].set_linewidth(0)
  48. plt.show()
  49.     
  50. fig.savefig(
  51.     "demo.png",
  52.     facecolor=fig.get_facecolor(),
  53.     dpi=200,
  54. )

可视化结果:

b2006225afad63b42ee348aad5295482.png

为不同行配置不同颜色

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. from plottable import ColDef, Table
  5. from plottable.plots import image
  6. import mpl_font.noto
  7. np.random.seed(2024)
  8. pf = pd.DataFrame(np.random.random((185)), columns=["成都""西安""北京""上海""重庆"]).round(2)
  9. pf['rank'] = list(range(119))
  10. fig, ax = plt.subplots(figsize=(1412),dpi=100)
  11. path = list(Path("./plottable/docs/example_notebooks/country_flags").glob("*.png"))[0]
  12. table_col_defs = [
  13.     ColDef("rank", border="right",width=0.5, title=""),
  14.     ColDef("成都", width=0.5, title=""),
  15.     ColDef("西安", width=0.35, title=""),
  16.     ColDef("北京", width=0.6, title="北京", textprops={"ha""center"}),
  17.     ColDef("上海", width=0.5, title="上海", formatter="{:+}"),
  18.     ColDef("重庆", border="left", title="重庆"),
  19. ]
  20. row_colors = {
  21.     "top4""#2d3636",
  22.     "top6""#516362",
  23.     "playoffs""#8d9386",
  24.     "relegation""#c8ab8d",
  25.     "even""#627979",
  26.     "odd""#68817e",
  27. }
  28. bg_color = row_colors["odd"]
  29. text_color = "#e0e8df"
  30. table_cols =['成都''西安''北京''上海''重庆']
  31. plt.rcParams["text.color"] = text_color
  32. fig.set_facecolor(bg_color)
  33. ax.set_facecolor(bg_color)
  34. table = Table(
  35.     pf,
  36.     column_definitions=table_col_defs,
  37.     row_dividers=True,
  38.     col_label_divider=False,
  39.     footer_divider=True,
  40.     index_col="rank",
  41.     columns=table_cols,
  42.     even_row_color=row_colors["even"],
  43.     footer_divider_kw={"color": bg_color, "lw"2},
  44.     row_divider_kw={"color": bg_color, "lw"2},
  45.     column_border_kw={"color": bg_color, "lw"2},
  46.     textprops={"fontsize"16"ha""center"},
  47. )
  48. for idx in [0123]:
  49.     table.rows[idx].set_facecolor(row_colors["top4"])
  50.     
  51. for idx in [45]:
  52.     table.rows[idx].set_facecolor(row_colors["top6"])
  53.     
  54. table.rows[15].set_facecolor(row_colors["playoffs"])
  55. for idx in [1617]:
  56.     table.rows[idx].set_facecolor(row_colors["relegation"])
  57.     table.rows[idx].set_fontcolor(row_colors["top4"])
  58. plt.show()
  59. fig.savefig(
  60.     "demo.png",
  61.     facecolor=fig.get_facecolor(),
  62.     dpi=200,
  63. )

可视化结果:

edb75c6e8a7ee7fd8d363f78582d22de.png

参考文档

  1. https://github.com/znstrider/plottable

  2. https://plottable.readthedocs.io/en/latest/notebooks/plots.html

z先生说

今天给大家分享plottable库结合pandas来对表格数据进行精美可视化,并提供对应的python可视化代码,干货满满。大家在实际过程中,可根据自己的喜好来定制对应的风格展示突出你数据重点。如果本文对你有帮助,还请你点赞关注转发。

-------- End --------

推荐

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/993094
推荐阅读
相关标签