【Python】分析图标可视化visualization - 详解 2期
一、引言
- 在大数据时代,优秀的数据可视化图表分析能帮助开发者、业务决策者快速洞察数据规律,了解业务全貌
- 📈本文详细介绍可视化图表的常见案例和分析操作
- 【Python】分析图标可视化visualization - 详解 1期】 大家反馈较好, 2期咱们继续研究和分享。
二、环境和包准备
- 依旧是环境准备,该准备的一步不能少喔。
# 环境:ipynb 3.6+
%matplotlib inline # 启用Jupyter内嵌绘图模式
import numpy as np
import pandas as pd
import matplotlib as mpl # 绘图系统底层配置,如字体、样式等
import matplotlib.pyplot as plt # 基础绘图库,支持折线图/柱状图等可视化
import seaborn as sns # 基于matplotlib的高级统计可视化库
import datetime as dt
import statsmodels.api as sm # 统计建模库,如线性模型/时间序列等
import statsmodels.formula.api as smf # 公式化建模接口
from patsy import dmatrices # 模型公式解析器
import scipy # 科学计算库,优化/积分/信号处理等
import scipy.stats as stats # 统计分布与假设检验工具
import rpy2 # Python与R语言交互接口
import rpy2.robjects as robjects # R对象转换与执行环境
三、图表和代码可视化visualization
3.1 Hist&KDE 直方图&核密度曲线
3.1.1 示例-1
# 计算小费占比(tip_pct = 小费/总账单),用于分析服务员小费收取比例特征
tips['tip_pct'] = tips['tip'] / tips['total_bill'] # 数值型特征工程
fig = plt.figure(figsize=[16, 6])
ax1 = fig.add_subplot(1, 2, 1) # 左-直方图
ax2 = fig.add_subplot(1, 2, 2) # 右-核密度估计
# 绘制左子图:直方图(分箱数50),展示数值分布特征
tips['tip_pct'].hist(bins=50, ax=ax1, alpha=0.7, edgecolor='k')
ax1.set_title('小费比例分布直方图', fontsize=12)
ax1.set_xlabel('小费比例', fontsize=10)
ax1.grid(linestyle='--', alpha=0.5) # 添加辅助线
# 绘制右子图:核密度估计(KDE),展示概率密度曲线
tips['tip_pct'].plot(kind='kde', ax=ax2, linewidth=2, color='darkorange')
ax2.set_title('核密度估计曲线', fontsize=12)
ax2.set_xlabel('小费比例', fontsize=10)
ax2.fill_between(ax2.lines[0].get_xdata(), # 填充曲线下方区域
ax2.lines[0].get_ydata(),
alpha=0.3, color='gold')
# 优化建议
plt.tight_layout(pad=3) # 调整子图间距
ax1.set_xlim(0, 1) # 限制X轴范围(小费比例0-100%)
ax2.set_xticks(np.linspace(0, 1, 5)) # 设置刻度间隔0.25
3.1.2 示例-2
# 生成两个正态分布数据集
comp1 = np.random.normal(0, 1, size=200)
comp2 = np.random.normal(10, 2, size=200)
values = pd.Series(np.concatenate([comp1, comp2]))
# 绘制直方图
values.hist(bins=100, alpha=0.3, color='k', density=True)
# 叠加核密度估计曲线
# kind='kde':使用高斯核函数进行概率密度估计
# style='k--':黑色虚线样式与直方图形成对比
values.plot(kind='kde', style='k--', linewidth=2)
# 扩展建议
plt.title('双峰分布数据可视化', fontsize=12)
plt.xlabel('数值分布区间', fontsize=10)
plt.ylabel('概率密度', fontsize=10)
plt.grid(axis='y', linestyle='--', alpha=0.5)
plt.legend(['KDE曲线', '直方图'], frameon=False)
3.2 Scratter 离散图&Scatter Matrix离散矩阵
3.2.1 示例-1
fig = plt.figure(figsize=[4, 4])
# 添加单子图布局
ax1 = fig.add_subplot(1, 1, 1)
# 生成带噪声的线性数据
x = np.arange(30) # 生成0-29的等差数列作为X值
y = x + np.random.randn(30) * 3 # 添加标准差为3的正态分布噪声
# 绘制散点图scatter详细参数说明
ax1.scatter(
x, y,
s=40, # 设置点尺寸为40像素
c='steelblue', # 设置主体颜色为钢蓝色
edgecolor='white', # 添加白色边框增强区分度
alpha=0.8, # 设置80%透明度防止点重叠
linewidths=0.8 # 边框线宽0.8像素
)
3.2.2 示例-2
file_path = r'D:/macrodata.csv'
data = pd.read_csv(file_path)
# 筛选核心经济指标列,保留消费价格指数(cpi)、货币供应量(m1)、国债利率(tbilrate)、失业率(unemp)
data = data[['cpi','m1','tbilrate','unemp']]
# 预处理
trans_data = np.log(data).diff().dropna()
# 绘制货币供应量变化与失业率变化的散点图
plt.scatter(
trans_data['m1'], # X轴:货币供应量对数差分值
trans_data['unemp'], # Y轴:失业率对数差分值
alpha=0.5, # 设置50%透明度防止点重叠
edgecolor='k' # 添加黑色边框增强区分度
)
# 设置动态标题
# %s占位符实现指标名称可配置化
plt.title('Changes in log x:%s vs. y:%s' % ('m1','unemp'), fontsize=12)
plt.xlabel('M1货币供应量对数差分', fontsize=10) # X轴标签说明
plt.ylabel('失业率对数差分', fontsize=10) # Y轴标签说明
plt.grid(linestyle=':', alpha=0.5) # 添加虚线网格
3.2.3 示例-3 离散矩阵
# 重置matplotlib样式为默认配置(避免继承之前的样式设置)
mpl.style.use('default')
# 生成散点矩阵图(多变量联合分布可视化)
pd.plotting.scatter_matrix(
trans_data,
diagonal='kde', # 对角线显示核密度估计曲线(替代直方图)
color='k',
alpha=0.3,
figsize=(12, 12),
density_kwds={'color': 'red'} # 建议补充:设置KDE曲线颜色
)
plt.show()
3.3 PIE 饼图
3.3.1 示例-1
fig, ax = plt.subplots()
size = 0.3 # 设置环形图宽度参数,半径比例
# 构造多层饼图数据矩阵
# 外层3组数据,每组包含2个子分类(共6个内层扇区)
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
cmap = plt.get_cmap("tab20c") # 配置色卡(tab20c色系包含20种渐变色)
# 外层颜色选择(间隔取色形成对比度)
outer_colors = cmap(np.arange(3)*4) # 取索引0,4,8的色块
# 内层颜色选择(确保与外层色系协调)
inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10])) # 取相邻渐变色
# 绘制外层环形图
# radius=1:设置外环半径为1
# wedgeprops:配置环形参数(width=环宽,edgecolor=边框色)
ax.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
wedgeprops=dict(width=size, edgecolor='w')) # 计算每组的和作为外层数据
# 绘制内层环形图
# flatten()展开为6个内层数据点(对应每组两个子分类)
# radius=1-size:内环半径适配外环宽度
ax.pie(vals.flatten(), radius=1-size, colors=inner_colors,
wedgeprops=dict(width=size, edgecolor='w'))
# 设置图形属性
# aspect="equal":强制等比例显示(正圆形)
# title:添加中心标题
ax.set(aspect="equal", title='Pie plot with `ax.pie`')
# 渲染显示图形
plt.show()
3.4 Radar 雷达图
3.4.1 示例-1
# 定义温度标签(显示在雷达图各轴线上)
labels = np.array(['3℃','5℃','6℃','3℃','1℃','3℃','3℃','2℃'])
dataLenth = 8 # 对应8个时间点的温度数据
# 创建温度数据数组
data = np.array([3,5,6,3,1,3,3,2]) # 每个元素代表不同时间点的温度值
# === 坐标计算阶段 ===
# 生成极坐标角度(将圆周分为dataLenth等分)
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
# 闭合处理
data = np.concatenate((data, [data[0]])) # 添加第一个数据点作为闭合点
angles = np.concatenate((angles, [angles[0]])) # 对应角度闭合处理
# === 可视化配置阶段 ===
# 创建画布和极坐标系
fig = plt.figure()
ax = fig.add_subplot(111, polar=True) # polar=True启用极坐标系
# 绘制雷达图主体
ax.plot(angles, data, 'ro-', linewidth=2)
# === 样式优化阶段 ===
# 设置角度刻度标签(转换为角度制)
ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
# 添加标题(va参数控制垂直对齐)
ax.set_title("温度变化雷达图", va='bottom', fontproperties="SimHei") # 标题下对齐避免遮挡
# 启用极坐标网格
ax.grid(True) # 显示网格辅助线(可扩展为ax.grid(linestyle=':', alpha=0.5))
plt.show()
3.4.2 示例-2
np.random.seed(19680801)
# === 数据生成阶段 ===
N = 150 # 散点数量
r = 2 * np.random.rand(N) # 生成[0,2)均匀分布的半径值
theta = 2 * np.pi * np.random.rand(N) # 生成[0,2π)均匀分布的角度值
area = 200 * r**2 # 面积与半径平方成正比,强化可视化对比度
colors = theta # 用角度值作为颜色映射基准
# === 可视化配置阶段 ===
fig = plt.figure()
ax = fig.add_subplot(111, projection='polar') # 创建极坐标系
# 绘制极坐标散点图
c = ax.scatter(
theta, r,
c=colors, # 颜色值绑定角度数据
s=area, # 点尺寸绑定半径平方值
cmap='hsv', # 循环色系匹配角度周期性(网页8推荐方案)
alpha=0.75, # 75%透明度防止重叠点遮挡
edgecolor='white', # 白色边框增强对比(网页7样式优化)
linewidth=0.5 # 边框线宽
)
3.4.3 示例-3
# === 极坐标图核心配置 ===
fig = plt.figure() # 创建画布
ax = fig.add_subplot(111, polar=True) # 创建极坐标系子图
# === 散点图绘制 ===
c = ax.scatter(theta, r, c=colors, s=area, cmap='hsv', alpha=0.75)
# === 极坐标轴配置 ===
# 设置极径原点偏移(形成环形效果)
# 参数-2.5将极径起点外扩,避免数据点被原点遮挡
ax.set_rorigin(-2.5)
# 设置0度基准线方位与偏移
# 参数'W'表示将0度方向调整至坐标系西侧(左侧)
# offset=10表示顺时针偏移10度(注意单位需转换为弧度:10 * np.pi/180)
ax.set_theta_zero_location('W', offset=10)
3.4.4 示例-4
labels = np.array(['a','b','c','d','e','f']) # 标签
dataLenth = 6 # 数据长度
data = np.array([1,4,3,6,4,8]) # 数据
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False) # 分割圆周长
data = np.concatenate((data, [data[0]])) # 闭合
angles = np.concatenate((angles, [angles[0]])) # 闭合
plt.polar(angles, data, 'bo-', linewidth=2) #做极坐标系
plt.thetagrids(angles * 180/np.pi, labels) # 做标签
plt.fill(angles, data, facecolor='r', alpha=0.25)# 填充
plt.ylim(0,10)
3.5 Complex Plot 复杂组合图 - 高阶
# 创建画布对象(指定画布编号和尺寸)
fig = plt.figure(num=1, figsize=[16, 9])
# 设置全局样式
mpl.style.use('seaborn') # 应用seaborn主题(含网格线/字体/配色优化)
# === 子图创建阶段 ===
# 创建2x2网格布局
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
# === 绘图操作阶段 ===
plt.plot(randn(50).cumsum(), 'ko--')
ax1.hist(randn(100), bins=20, color='k', alpha=0.3) # 绘制直方图
ax2.scatter(np.arange(30), np.arange(30) + randn(30)*3) # 绘制带噪声的散点图
# === 特殊布局处理 ===
# 正确添加第4个子图(避免索引冲突)
ax4 = fig.add_subplot(2, 2, 4) # 正确索引:2x2网格的第4个子图(右下)
data = randn(50).cumsum()
ax4.plot(data, 'k--', label='Default')
ax4.plot(data, 'r--', label='steps-post', drawstyle='steps-post')
ax4.legend(loc='best') # 自动选择最佳图例位置(根据数据分布自动调整)
# 添加坐标文本注释(需注意坐标系转换)
ax4.text(0, 0, 'Hello World')
四、总结
总共整理了2期,关于【Python】分析图标可视化visualization的内容(1期地址点这里),希望有帮助。