【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期地址点这里),希望有帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值