五种Pandas图表美化样式汇总
Pandas是一种高效的数据处理库,它以dataframe和series为基本数据类型,呈现出类似excel的二维数据。
在Jupyter中,会美化Pandas的输出。不同于IDE展示的文本形式,Jupyter可以通过CSS修改表格的样式。
我们在做excel表格的时候,常常会对重要数据进行highlight,或者用不同颜色表示数据的大小。这在Pandas中也是可以实现的,而且非常简洁。
Pandas提供了DataFrame.style
属性,它会返回Styler
对象,用以数据样式的美化。
一般的,我们需要将样式函数作为参数传递到下面方法中,就可以实现图表美化。
Styler.applymap: 作用于元素
Styler.apply:作用于行、列或整个表
下面通过一些例子,具体展示常用的美化形式。
一、高亮显示
为便于展示,数据示例是用的2021世界人口数量前十国家数据。
import pandas as pd
data = pd.read_excel(r"E:\\jupyter_notebook\\2021世界人口数据.xlsx")
data
![](https://filescdn.proginn.com/a648225b07adbe2e3c9b842a47a0ef11/25bab5f1a6ef5bec32133bc7912498c0.webp)
我们先看下该表的信息:
data.info()
![](https://filescdn.proginn.com/566c62f3994684cd3bc99479b9d9091b/28696b14aa9bf397a173395bbc233714.webp)
除了前两列,其他列都为数字类型。
现在对指定列的最大值进行高亮处理:
def highlight_max(s):
'''
对列最大值高亮(黄色)处理
'''
is_max = s == s.max()
return ['background-color: yellow' if v else '' for v in is_max]
data.style.apply(highlight_max,subset=['2021人口', '2020人口', '面积','单位面积人口','人口增幅','世界占比'])
![](https://filescdn.proginn.com/f3d372db028145d38d081e6f4d3a6a72/e5a846fdf92125a2adf5ffaeb5ee4da8.webp)
如果不想对元素背景高亮处理,也可以直接更改指定元素颜色,从而达到突出重点的目的。
标记单位面积人口列大于200的元素:
def color_red(s):
is_max = s > 200
return ['color : red' if v else '' for v in is_max]
data.style.apply(color_red,subset=['单位面积人口'])
![](https://filescdn.proginn.com/111c4e11357101e170fb5dca133a89fb/2e56b9e52746b9d89d56acc0614212d7.webp)
二、数据条显示
Excel条件格式里,有一个数据条显示方式,用以可视化表达数据大小。
Pandas Style方法中也有数据条的表达形式,用df.style.bar
来实现。
还是用前面人口数据的例子,我们来看下如何操作数据条。
import pandas as pd
data = pd.read_excel(r"E:\\jupyter_notebook\\2021世界人口数据.xlsx")
# 数据条显示指定列数据大小
data.style.bar(subset=['2021人口', '2020人口'], color='#FFA500')
![](https://filescdn.proginn.com/cb471d998d97afbd4cb718e0151d88e3/5ccde9cbef32761ab02359d69b7ef34a.webp)
三、色阶显示
色阶也就是热力图,它和数据条一样,都用来表达数据大小。
Pandas Style中色阶的使用也很简单,用df.style.background_gradient
实现。
import seaborn as sns
# 使用seaborn获取颜色
cm = sns.light_palette("green", as_cmap=True)
# 色阶实现
data.style.background_gradient(cmap=cm,subset=['2021人口', '2020人口', '面积','单位面积人口','人口增幅','世界占比'])
![](https://filescdn.proginn.com/384f256177db710afaeadea4e15b1f9a/466ef8f59a62fbcec967c6bc061d604c.webp)
可以通过选择最大最小颜色比例,调节色阶范围。
调节前:
import seaborn as sns
# 色阶实现,这里使用内置色阶类型,不调节颜色范围
data.style.background_gradient(cmap='viridis',high=0.2,low=0.1,subset=['2021人口', '2020人口', '面积','单位面积人口','人口增幅','世界占比'])
![](https://filescdn.proginn.com/005918c4de23b3c72fc7f55f402e42ba/c8186d4043d0cc81c2cec057a7bac27c.webp)
调节后:
import seaborn as sns
# 色阶实现,这里使用内置色阶类型,调节颜色范围
data.style.background_gradient(cmap='viridis',high=0.5,low=0.3,subset=['2021人口', '2020人口', '面积','单位面积人口','人口增幅','世界占比'])
![](https://filescdn.proginn.com/d1905cf48eb270b0aeb119effdca4ba6/d06ac47c33d53f4068179312cbf789d0.webp)
四、百分比显示
有些数字需要百分比显示才能准确表达,比如说人口数据里的人口增幅、世界占比。
Pandas可以数据框中显示百分比,通过Styler.format
来实现。
data.style.format("{:.2%}",subset=['人口增幅','世界占比'])
![](https://filescdn.proginn.com/76a66efb24287877deff251f54fb7a6c/71cf67f3860034aa43af01c9523f0525.webp)
五、标记缺失值
数据集中可能会存在缺失值,如果想突出显示缺失值,该怎么操作?
这里有好几种常用的方法,一是用-
符号替代,二是高亮显示
先创建一个带缺失值的表,还是用人口数据。
import pandas as pd
import numpy as np
data = pd.read_excel(r"E:\\jupyter_notebook\\2021世界人口数据.xlsx")
data.iloc[1, 4] = np.nan
data.iloc[3, 1] = np.nan
data.iloc[6, 6] = np.nan
data
![](https://filescdn.proginn.com/4a9e9d5a7b39505236017ced1ae397cd/26e0b67119e63edbf663cc87beb3dc92.webp)
上面数据中有三个缺失值,我们用-
符号替代缺失值:
data.style.format(None, na_rep="-")
![](https://filescdn.proginn.com/95a8c63161cb1870156db0343ebf9a16/ffd33ee8eabe2f864e1417b0739b7831.webp)
再试试对缺失值高亮显示:
data.style.highlight_null(null_color='red')
![](https://filescdn.proginn.com/132494fed49d56afdd15337ab4bf30cf/4dd209bbb81e00ce9be918f244b853ca.webp)
附:将样式输出到excel
Pandas中的数据美化样式不仅可以展示在notebook中,还可以输出到excel。
这里使用to_excel方法,并用openpyxl作为内核
import pandas as pd
import numpy as np
data = pd.read_excel(r"E:\\jupyter_notebook\\2021世界人口数据.xlsx")
data.style.background_gradient(cmap='viridis',subset=['2021人口', '2020人口', '面积','单位面积人口','人口增幅','世界占比']).\
to_excel('style.xlsx', engine='openpyxl')
![](https://filescdn.proginn.com/8b027fd16405ba1c0b0b78fad1dd1215/5d42db87147678299ae758cc8be3ee9a.webp)
❝本文参考Pandas官方文档Styling章节
![](https://filescdn.proginn.com/f548bd958d8e5ba02100562b276d28c0/145e12df7dc62d274fd30a6c053e20a5.webp)
加入知识星球【我们谈论数据科学】
400+小伙伴一起学习!
· 推荐阅读 ·