数据可视化--使用matplotlib绘制高级图表

目录

一、绘制等高线图

contour()

二、绘制矢量场流线图

streamplot()

三、绘制棉棒图

stem()

四、绘制哑铃图

五、绘制甘特图

六、绘制人口金字塔图

barh()

七、绘制漏斗图

简易版漏斗图

八、绘制桑基图

Sankey()---创建桑基图

add()---添加桑基图的选项

finish()---返回桑基图绘制完成的对象

桑基子图包含以下字段

九、绘制树状图

dendrogram()---将层次聚类数据绘制为树状图

linkage()---将一维压缩距离矩阵或二维观测向量阵列进行层次聚类或凝聚聚类

十、绘制华夫饼图

pywaffle的安装

pywaffle的使用


一、绘制等高线图

等高线图是地形图上高程相等的相邻各点所连成的闭合曲线,它会将地面上海拔高度相同的点连成环线,之后将环线垂直投影到某一水平面上,并按照一定的比例缩绘到图纸上,常见于山谷、山峰或梯度下降算法的场景。

等高线图包含三个主要的信息,分别为坐标点的x值、坐标点y值以及坐标点的高度。假设坐标点的高度为h,则h、x、y之间的关系如下所示:

contour()

contour([X, Y,]Z, [levels,]**kwargs)

X,Y:表示坐标点的网格数据。

Z:表示坐标点对应的高度数据。

levels:表示等高线的数量。若levels为n,则说明绘制n+1条等高线。

colors:表示不同高度的等高线颜色。

cmap:表示颜色映射表。

linewidths:表示等高线的宽度。

linestyles:表示等高线的线型。

需要注意的是,参数X、Y需要接收网格数据,即以坐标矩阵批量地描述点的位置。numpy模块的meshgrid()函数可以生成网格数据。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 定义计算高程的函数
def calcu_elevation(x, y):
    return np.sin(np.sqrt(x**2 + y**2))
# 生成网格数据
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
x_grid, y_grid = np.meshgrid(x, y)
# 创建图形和子图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111)
# 绘制等高线
con = ax.contour(x_grid, y_grid, calcu_elevation(x_grid, y_grid), 8, colors='black')
# 填充等高线的颜色
ax.contourf(x_grid, y_grid, calcu_elevation(x_grid, y_grid), 8, alpha=0.75, cmap=plt.cm.copper)
# 为等高线添加文字标签
ax.clabel(con, inline=True, fmt='%1.1f', fontsize=10)
# 添加标题和标签
ax.set_title('等高线图示例', fontsize=15)
ax.set_xlabel('X轴', fontsize=12)
ax.set_ylabel('Y轴', fontsize=12)
# 添加颜色条
cbar = plt.colorbar(ax.contourf(x_grid, y_grid, calcu_elevation(x_grid, y_grid), 8, alpha=0.75, cmap=plt.cm.copper))
cbar.set_label('高程', fontsize=12)
# 显示网格线
plt.grid(True, linestyle='--', alpha=0.7)
# 显示图形
plt.tight_layout()
plt.show()

二、绘制矢量场流线图

矢量场流线图可以表现矢量场的流态,常见于科学和自然学科中的磁场、万有引力和流体运动等场景。

矢量场流线图包含多条带有箭头的线条,其中线条的长度表示矢量场的强度,箭头的方向表示矢量场的方向。此外,矢量场的强度也可以使用线条的密度来表示。

streamplot()

streamplot(x, y, u, v, density=1, linewidth=None, col=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', minlength=0.1, transform=None, zorder=None, start_points=None, maxlength=4.0, integration_direction='both', *, data=None)

x,y:表示间距均匀的网格数据。

u,v:表示(x,y)速率的二维数组。

density:表示流线的密度。

linewidth:表示流线的宽度。

arrowsize:表示箭头的大小。

arrowstyle:表示箭头的类型。

minlength:表示流线的最小长度。

maxlength:表示流线的最大长度。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
y, x = np.mgrid[0:5:50j, 0:5:50j]
u = x
v = y
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制矢量场流线图
ax.streamplot(x, y, u, v)
plt.show()

三、绘制棉棒图

棉棒图亦称为火柴杆图、大头针图或棒棒糖图,由线段(茎)与标记符号(茎头,默认为圆点)连接而成,其中线段表示数据点到基线的距离,标记符号表示数据点的数值。

棉棒图是柱形图或条形图的变形,主要用于比较标记符号的相对位置,而非比较线段的长度。

stem()

stem([x,] y, linefmt=None, markerfmt=None, basefmt=None, bottom=0, label=None, use_line_collection=False, data=None)

x,y:表示茎的x值和茎头的y值。

linefmt:表示茎属性的字符串。

markerfmt:表示茎头属性的字符串。

basefmt:表示基线属性的字符串。

bottom:表示基线的y值。 label:表示应用于图例的标签。

use_line_collection:若设为True,则将棉棒图的所有线段存储到一个LineCollection类对象中;若设为False,则将棉棒图的所有线段存储到列表中。

四、绘制哑铃图

哑铃图亦称为DNA图(图表横着看像哑铃,竖着看像DNA),主要用于展示两个数据点之间的变化。

哑铃图可以看作散点图与线型图的组合,适用于比较各种项目"前"与"后"的位置及项目的等级排序的场景。

五、绘制甘特图

甘特图亦称为横道图、条状图,它通过活动列表和时间刻度表示特定项目的顺序与持续时间。甘特图一般以时间为横轴,项目为纵轴,可以直观地展示每个项目的进展情况,便于管理者了解项目的剩余任务及评估工作进度。

使用pyplot的barh()函数可以绘制一个甘特图,只需要给该函数的left参数传值,指定每个矩形条的x坐标即可。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Patch

# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]

# 数据定义
tasks = np.array(['报告提交', '数据分析', '数据录入', '实地执行', '问卷确定', '试访', '问卷设计', '项目确定'])
y_positions = np.arange(1, 9)
durations = np.array([0.5, 1.5, 1, 3, 0.5, 1, 1, 2])
start_times = np.array([7.5, 6, 5.5, 3, 3, 2, 1.5, 0])

# 创建图形和子图
fig, ax = plt.subplots(1, 1, figsize=(12, 8))

# 定义颜色映射(可以根据任务类型分配不同颜色)
colors = ['#CD5C5C', '#3CB371', '#4169E1', '#FFA500', '#9370DB', '#87CEFA', '#DDA0DD', '#90EE90']

# 绘制甘特图条形
bars = ax.barh(y_positions, durations, left=start_times, color=colors, alpha=0.8, edgecolor='black')

# 移除顶部和右侧的边框
[ax.spines[i].set_visible(False) for i in ['top', 'right']]

# 设置左侧和底部边框样式
ax.spines['left'].set_linewidth(1.5)
ax.spines['bottom'].set_linewidth(1.5)

# 设置y轴刻度标签和范围
plt.yticks(y_positions, tasks, ha='right', fontsize=12)
plt.ylim(0, 9)

# 设置x轴刻度和范围
plt.xticks(np.arange(0, 11, 1), fontsize=10)
plt.xlim(0, 10)

# 添加标题
plt.title('项目执行时间安排甘特图', fontsize=16, pad=20)

# 添加x轴标签
plt.xlabel('时间(天)', fontsize=12, labelpad=10)

# 为每个任务添加数据标签
for i, (start, duration, bar) in enumerate(zip(start_times, durations, bars)):
    ax.text(start + duration/2, y_positions[i], f'{duration}天', 
            ha='center', va='center', color='white', fontweight='bold')

# 添加网格线(水平方向)
plt.grid(axis='x', linestyle='--', alpha=0.7)

# 添加图例
legend_elements = [Patch(facecolor=colors[i], edgecolor='black', label=tasks[i]) for i in range(len(tasks))]
ax.legend(handles=legend_elements, loc='upper right', bbox_to_anchor=(1.3, 1), title='任务')

# 调整布局
plt.tight_layout()

# 显示图形
plt.show()

六、绘制人口金字塔图

人口金字塔图是指用类似古埃及金字塔的形象描述人口年龄与性别分布状况的图形,用于表现人口的现状及其发展类型。人口金字塔图一般以年龄为纵轴、以人口数为横轴,按年龄自然顺序自下而上在纵轴左侧和右侧绘制并列的横向矩形条,纵轴左侧为男,右侧为女。

barh()

七、绘制漏斗图

漏斗图亦称为倒三角图,它将数据呈现为几个阶段,每个阶段的占比总计为100%,从一个阶段到另一阶段的数据自上而下逐渐降低。漏斗图通过展示业务各阶段数据的变化,可以帮助运营人员快速发现问题,适用于业务流程较为规范、周期长、环节多的流程分析的场景。

简易版漏斗图

八、绘制桑基图

桑基图亦称为桑基能量分流图、桑基能量平衡图,是一种特定类型的流程图,用于展示数据的"流动"变化。

桑基图中包含若干条从左到右延展的分支,每条分支的宽度代表着数据流量的大小,且所有主支宽度的总和等于所有分支宽度的总和,常见于能源、材料成分等场景或金融领域。

Sankey()---创建桑基图

Sankey(ax=None, scale=1.0, unit='', format='%G', gap=0.25, radius=0.1, shoulder=0.03, offset=0.15, head_angle=100, margin=0.4, tolerance=1e-06, **kwargs)

ax:若不提供该参数,会创建一个新的坐标轴。

scale:表示流量比例因子比例调整分支的宽度。

unit:表示与流量相关的物理单位的字符串。若设为None,则不会做数量标记。

gap:表示进入或离开顶部或底部的分支之间的间距,默认为0.25。

add()---添加桑基图的选项

add(self, patchlabel='', flows=None, orientations=None, labels='', trunklength=1.0, pathlengths=0.25, prior=None, connect=(0, 0), rotation=0, **kwargs)

patchlabel:表示位于图表中心的标签。

flows:表示流量数据的数组,其中投入数据为正值,产生数据为负值。

orientations:表示流的方向列表或用于所有流的单个方向,可以取值为0(从左侧输入、右侧输出)、1(从顶部到顶部)或-1(从底部到底部)。

labels:表示流的标签列表或用于所有流的单个标签。

trunklength:表示输入组和输出组的基之间的长度。

finish()---返回桑基图绘制完成的对象

桑基子图包含以下字段

patch:表示桑基子图的轮廓。

flows:表示流量值(输入为正,输出为负)。

angles:表示箭头角度的列表。

tips:表示流路径的尖端或凹陷位置的数组,其中每一行是一个(x, y)。

text:表示中心标签的Text实例。

texts:表示流分支标签的Text实例。

九、绘制树状图

树状图亦称为树枝状图,是一种通过树状结构描述父子成员层次结构的图形。树形图的形状一般是一个上下颠倒的树,其根部是一个没有父成员的根节点,之后从根节点开始是用线连接子成员,使子成员变为子节点,直至线的末端为没有子成员的树叶节点为止。树状图用于说明成员之间的关系和连接,常见于分类学、进化科学、企业组织管理等领域。

dendrogram()---将层次聚类数据绘制为树状图

dendrogram(Z, p=30, truncate_mode=None, color_threshold=None, get_leaves=True, orientation='top', labels=None, count_sort=False, distance_sort=False, show_leaf_counts=True, **kwargs)

Z:表示编码层次聚类的链接矩阵。

truncate_mode:表示截断的模式,用于压缩因观测矩阵过大而难以阅读的树状图,可以取值为None(不执行截断,默认)、'lastp'、'level'。

color_threshold:表示颜色阈值。

labels:表示节点对应的文本标签。

linkage()---将一维压缩距离矩阵或二维观测向量阵列进行层次聚类或凝聚聚类

linkage(y, method='single', metric='euclidean', optimal_ordering=False)

y:可以是一维距离向量或二维的坐标矩阵。

method:表示计算类簇之间距离的方法,常用的取值可以为'single'、 'complete'、 'average'和'ward',其中'single'表示将类簇与类簇之间最近的距离作为类簇间距; 'complete' 表示将类簇与类簇之间最远的距离作为类簇间距;'average'表示将类簇与类簇之间的平均距离作为类簇间距;'ward'表示将每个类簇的方差最小化作为类簇间距。

十、绘制华夫饼图

华夫饼图亦称为直角饼图,它是饼图的变体,可以直观地展示部分与整体的比例。

华夫饼图一般由100个方格组成,其中每个方格代表1%,不同颜色的方格代表不同的分类,常见于比较同类型指标完成比例的场景,比如电影上座率、公司业务实际完成率等。

pywaffle的安装

pip install pywaffle

以上命令执行后,若命令提示符窗口出现如下字样,说明pywaffle包安装完成

安装完成后,在提示符的后面输入python,之后输入如下导入语句进行验证:

from pywaffle import Waffle

执行以上语句后,若命令提示符窗口没有出现任何错误信息,说明pywaffle安装成功,否则说明安装失败。

pywaffle的使用

pywaffle是Python中专门绘制华夫饼图的包,它提供了一个继承自Figure的子类Waffle,通过将Waffle类传递给figure()函数的FigureClass参数,即可创建一个华夫饼图。关于figure()函数中创建华夫饼图的常用参数的含义如下:

FigureClass:可以是Figure类或Figure子类。

rows:表示华夫饼图的行数。

columns:表示华夫饼图的列数。

values:表示数据,可以接收数组或字典。若values参数接收一个字典,则将字典的键作为华夫饼图的图例项。

colors:表示每个分类数据的颜色列表。

vertical:表示是否按垂直方向绘制华夫饼图,默认为False。

title:表示标题,可以接收一个字典,其中字典的键为title()函数的关键字参数。

legend:表示图例,可以接收一个字典,其中字典的键为legend()函数的关键字参数。

相关推荐
亿牛云爬虫专家1 小时前
智能嗅探AJAX触发:机器学习在动态渲染中的创新应用
机器学习·ajax·爬虫代理·代理ip·嗅探·新闻·www.toutiao.com
程序小武2 小时前
python编辑器如何选择?
后端·python
一叶知秋12112 小时前
UV管理python项目
python
AndrewHZ2 小时前
【图像处理入门】2. Python中OpenCV与Matplotlib的图像操作指南
图像处理·python·opencv·计算机视觉·matplotlib·图像操作
golitter.3 小时前
langchain学习 01
python·学习·langchain
江苏泊苏系统集成有限公司3 小时前
半导体晶圆制造洁净厂房的微振控制方案-江苏泊苏系统集成有限公司
人工智能·深度学习·目标检测·机器学习·创业创新·制造·远程工作
一叶知秋12113 小时前
LangChain Prompts模块
python
量化金策4 小时前
截面动量策略思路
python
心软且酷丶4 小时前
leetcode:7. 整数反转(python3解法,数学相关算法题)
python·算法·leetcode
逾非时4 小时前
python:selenium爬取网站信息
开发语言·python·selenium