前言
大家好。之前给大家分享一篇关于pandas的实战教程,干货满满:万字长文-数据分析之pandas精品免费教程如果你想要系统的了解学习pandas的语法和python开发技巧,可以查看上面这篇文章。
今天给大家分享的主题是可视化技巧,之前陆续给大家分享过部分关于如何绘制精美图表的可视化技巧,但比较零散;今天决定整理一份详细的可视化技巧教程,给大家介绍绘制可视化基础知识、可视化图表推荐展示(突出重点)、以及在数据分析挖掘中实用的可视化库表; 每个案例都有对应的python代码,干货满满,本文内容较多,可以收藏慢慢看。
个人认为可视化图表主要的作用有2点; a.展示你想表达的内容给你想看的读者/观众;b.突出重点。即通过可视化向你的观众展示你最想要表达的内容。本文给大家分享多种实用可视化技能并给出对应的python实现案例供大家参考,即便在多维数据展示也可以直观明了的突出自己所表达的重点。可视化前提是真实数据,否则再精美图表展示也毫无意义。如果对你有帮助,还请点赞关注转发~
老规矩,本文涉及的python各个库版本信息如下:
!python -V #3.10 # !pip install mpl_font==1.1.0 mplcyberpunk mplfonts=0.0.8 # !pip install scikit-plot==0.3.7 # !pip install joypy==0.2.6 # !pip install dtreeviz==1.3.2 scikit-learn==1.0.2 cairosvg==2.7.1 # !pip install pybaobabdt==1.0.1 pygraphviz==1.12 # !pip install biokit==0.5.0 # !pip install patchworklib==0.6.0 # !pip install wordcloud==1.9.3 # !pip install pyecharts==1.9.0 import seaborn as sns import matplotlib import mpl_font.noto import pandas as pd import numpy as np import mplcyberpunk print("seaborn:", sns.__version__," matplotlib:", matplotlib.__version__) #seaborn: 0.12.2 matplotlib: 3.7.4 print("pandas:", pd.__version__," numpy:", np.__version__) #pandas: 2.2.0 numpy: 1.26.3
本文目录
-
基础篇: 必知必会的可视化技巧
-
matplotlib库表显示中文字体
-
matplotlib创建画布fig、ax的方法总结
-
使用pandas.plot函数进行快速可视化
-
赛博朋克可视化风格让你的图表科幻感十足
-
图表配色推荐
-
进阶篇: 可视化图展示形式-推荐用图总结
-
单条折线图太单调?可以使用面积图来代替
-
当多种类型的折线图相互叠加时,建议分类型展示
-
太多类型饼图展示不下?可以使用排序后渐变柱状图展示
-
同类型不同阶段对比图可以考虑使用双系列重叠图表示
-
多个维度的度量展示可以拆分为多个图(每个图展示单个维度)
-
同时展示季度和月份
-
类别标签过长建议为顶部错落展示
-
应用篇: 基于scikit-plot库对机器学习的结果进行可视化
-
绘制ks曲线
-
绘制聚类的elbow曲线
-
应用篇: 基于joyplot库精美展示山脊图和多维直方图
-
展示多维山脊图
-
展示多维直方图
-
应用篇: 对决策树模型进行精美可视化
-
利用dtreeviz库对决策树模型可视化
-
使用pybaobabat库展示
-
应用篇: 绘制多组数据统计分布状态图
-
分组统计柱状图使用seaborn库快速实现分组统计柱状图
-
基于seaborn的箱型图&&散点图&&分布显著性检验
-
实战篇: 精美可视化案例绘制
-
热力图:利用biokit库绘制精美热力图
-
滑珠图: 绘制滑珠图展示不同产品2个阶段的对比
-
多图布局:基于patchworklib库进行多个图表布局
-
词云图:利用WordCloud库来展示精美词云展示
-
交互式图表: 利用pyecharts绘制可交互的图表
-
多种度量分组展示: 绘制多图直观展示不同的度量指标
-
参考文档
基础篇: 必知必会的可视化技巧
matplotlib库表显示中文字体
给大家推荐下面2个库可彻底解决Matplotlib亚洲字体 (中文、韩文及日文等)乱码问题、轻松管理Matplotlib字体库;
-
mpl-font(github仓库:https://github.com/koho/mpl-font)
-
mplfonts(github仓库:https://github.com/Clarmy/mplfonts )
# 方式一 pip install mplfonts !mplfonts init #安装好之后需要在bash环境单独执行 # 方式二 !pip install mpl_font==1.16.0 import mpl_font.noto # 示例代码 import matplotlib.pyplot as plt from mplfonts.util.manage import use_font FONT_NAMES = { "Noto Sans Mono CJK SC": "Noto等宽", "Noto Serif CJK SC": "Noto宋体", "Noto Sans CJK SC": "Noto黑体", "Source Han Serif SC": "思源宋体", "Source Han Mono SC": "思源等宽", "SimHei": "微软雅黑", } fig,axes = plt.subplots(3,2,figsize=(12, 6)) for index,(font_name, desc) in enumerate(FONT_NAMES.items()): use_font(font_name) axes[int(index/2),index%2].text(0.1, 0.6, font_name, fontsize=20) axes[int(index/2),index%2].text(0.1, 0.2, desc, fontsize=20) plt.show()
输出结果:
matplotlib创建画布fig、ax的方法总结
当我们进行复杂图表绘制时,需要灵活性强。我通常喜欢实用matplotlib库来绘制复杂图表,其底层api支持几乎各种款式自定义,缺点就是需要对代码和函数接口深入了解。 matplotlib库中创建图的方式主要有下面几种:
-
通过fig创建ax主要有2种方式;方式一、方式二;
-
通过plt创建ax主要有3种方式;方式三、方式四、方式五;
-
插入画中画;即通过ax创建ax主要有1种方式;方式六
# 定义fig fig= plt.figure(figsize=(8,12), dpi=200) # 方式一 自定义画布ax ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 散点图位置 ax2 = fig.add_axes([0.1, 0.9, 0.8, 0.1]) # 边际分布图位置 ax3 = fig.add_axes([0.9, 0.1, 0.1, 0.8]) # 边际分布图位置 #方式二 fig.subplots_adjust(left=0.1, wspace=0.06, hspace=0.06) ax1 = fig.add_subplot(221) ax2 = fig.add_subplot(222) ax3 = fig.add_subplot(223) ax4 = fig.add_subplot(224) # 方式三 # 绘制不规则的网格ax(空间布局) ax = plt.subplot2grid((3,3),(0,0),rowspan=1, colspan=1) do_something(ax) ax = plt.subplot2grid((3,3),(0,1),rowspan=1, colspan=1,projection='polar') do_something(ax) ax = plt.subplot2grid((3,3),(0,1),rowspan=1, colspan=2) # 使用一行2列的位置区间画图 do_something(ax) # 方式四 fig, axes = plt.subplots(3,3) ax1= axes[0,0] #第一个位置的画布 ax2= axes[2,2] #第一个位置的画布 plt.subplots_adjust(wspace=0.06, hspace=0.06) # 方式五 ax= plt.subplot(221) ax= plt.subplot(222) plt.subplots_adjust(wspace=0.06, hspace=0.06) # 方式六 from mpl_toolkits.axes_grid1.inset_locator import inset_axes axins = inset_axes(ax, width=.4, height=.4,loc='upper left', bbox_to_anchor=(0.01, 0.22, 1, 1), bbox_transform=ax.transAxes, borderpad=0) axins.set_ylim(bottom=8,top=35) axins.set_xlim(left=-.5,right=2.5) #通过ax获得fig fig =ax.get_figure() # 关闭fig plt.close(fig)
使用pandas.plot函数进行快速可视化
在文章万字长文-数据分析之pandas精品免费教程中可视化部分给大家详细介绍pandas的plot函数;这里就以绘制的柱状图,可以看出非常的精简,用于快绘制想要的图表。
import pandas as pd from mplfonts import use_font import matplotlib.pyplot as plt use_font('Noto Sans CJK SC') test_dict = {'销售量': [1000, 2000, 5000, 2000, 4000, 3000], '收藏量': [1500, 2300, 3500, 2400, 1900, 3000]} df = pd.DataFrame(test_dict, index=['一月', '二月', '三月', '四月', '五月', '六月']) text_kwargs = dict(figsize=(8, 4), fontsize=9) ax = df['销售量'].plot(title='销量图', kind='bar', rot=45, **text_kwargs) m_ax = ax.bar(df.index.tolist(), df['销售量'].tolist(),color= ["#D9D9D9","#547DB1", '#EA8379','#7DAEE0','#B395BD']) ax.bar_label(m_ax) plt.show()
输出结果:
赛博朋克可视化风格让你的图表科幻感十足
mplcyberpunk 库(官方github:https://github.com/dhaitz/mplcyberpunk)是一个基于matplotlib库的主题库,提供赛博朋克风格科幻风格的主题,可以让你的图表更加精美。
!pip install mpl_font==1.16.0 import matplotlib.pyplot as plt import mplcyberpunk import mpl_font.noto with plt.style.context("cyberpunk"): categories = ['成都', '重庆', '上海', '西安', '南京'] values = [25, 67, 19, 45, 10] colors = ["#D9D9D9","#547DB1", "#719DC9", "#C6D6EA", "#DEE7F3"] fig, ax =plt.subplots(figsize=(6,3)) bars = ax.bar(categories, values, color=colors, zorder=2) ax.bar_label(bars) mplcyberpunk.add_bar_gradient(bars=bars) plt.show()
图表配色推荐
给大家分享在平时绘图中好看常用的配色;
常见好看的色谱图
耐看的配色:
双色配色: #C9342B #339DB5 双色配色: #E6846D #8DCDD5 双色配色: #F9BEBB #89C9C8 双色配色: #9FC9DF #F1E1C7 双色配色: #C8D7EB #FAEBC7 双色配色: #9E9E9E #F5C96B 双色配色: #8A7197 #999A9E 双色配色: #B291B5 #3BA997 三色折线图配色: #C24976 #469393 #84C2AE 三色折线图配色: #EA8379 #7DAEE0 #B395BD 三色柱状图配色: #299D8F #E9C46A #D87659 三色柱状图配色: #EF76TA #456990 #48C0AA 四色柱状图配色: #55B7E6 #193E8F #E53528 #F09739 四色柱状图配色: #66529F #A37E7D #BF9895 #DAB2B2 四色柱状图配色: #DB432C #438870 #838AAF #C4B797 五色配图配色: #D9D9D9 #547DB1 #719DC9 #C6D6EA #DEE7F3 六色分面组图配色: #427AB2 #F09148 #FF9896 #DBDB8D #C59D94 #AFC7E8 六色密度图配色: #EEA599 #FAC795 #FFE9BE #E3EDEO #ABD3E1 #92B4C8 多色机制图配色:#43978F #9EC4BE #ABDOF1 #DCE9F4 #E56F5E #F19685 #F6C957 #FFB77F #FBE8D5 多色机制图配色: #D3D3D3 #DEBF80 #DCCD5B #73AD96 #5F9069 #375631 多色机制图配色: #343434 #DFE9F4 #245297 #85C17E #CDE8C3 #62AA67
进阶篇: 可视化图展示形式-推荐用图总结
单条折线图太单调?可以使用面积图来代替
折线图一般用于描述某个类型的趋势变化情况;一般来说对应的x轴的业务含义是有相对位置关系的。单条折线图展示过于单调,建议使用面积图来代替单一的折线图,使得图表丰富起来,下面是对应的案例展示。
from mplfonts.util.manage import use_font use_font('Noto Sans CJK SC') import matplotlib.pyplot as plt import mplcyberpunk with plt.style.context("cyberpunk"): x = ['202309', '202310', '202311', '202312', '202401'] y = [25, 67, 19, 45, 10] fig, axes =plt.subplots(1,2, figsize=(8,3),dpi=200) ax=axes[0] ax.set_title("不建议图表展示风格",color='red', fontsize=8) ax.plot(x,y,marker='^') use_font('Noto Sans CJK SC') ax=axes[1] ax.set_title("建议绘制展示风格",color='green', fontsize=8) ax.plot(x,y,marker='^') use_font('Noto Sans CJK SC') mplc