Python轮子:pandas绘图

原文链接:http://www.juzicode.com/python-module-pandas-plot

Pandas的plot子模块是基于Matplotlib的高级封装,专为DataFrame和Series数据结构设计。它实现了数据可视化与数据分析的无缝衔接,通过简洁的链式调用即可生成专业图表,极大提升数据探索效率。

应用场景

  • 时间序列数据趋势分析
  • 多维度数据分布比较
  • 数据质量快速诊断
  • 业务指标自动可视化报表
  • 大规模数据抽样展示
  • 探索性数据分析(EDA)

安装与导入

pip install pandas

使用方法

1)时间序列折线图

处理时间索引数据,绘制线型图。

# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] =  ['YouYuan']   
plt.rcParams['axes.unicode_minus'] = False  

dates = pd.date_range('2023-01-01', periods=30)
df = pd.DataFrame({
    '销售额': np.random.randint(50,200,30).cumsum(),
    '用户量': np.random.randint(100,500,30)
}, index=dates)

df.plot(title='业务增长趋势', 
        figsize=(10,5),
        secondary_y=['用户量'],
        grid=True,
        style={'销售额':'g-o', '用户量':'b--'})
plt.savefig('pandas_line.png')
双Y轴自动对齐时间刻度

2)多维度柱状图

制作多维柱状图,分组数据对比分析。

# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] =  ['YouYuan']   
plt.rcParams['axes.unicode_minus'] = False  

df_group = pd.DataFrame({
    '北京': [120, 230, 180],
    '上海': [90, 150, 200],
    '广州': [80, 170, 210]
}, index=['Q1', 'Q2', 'Q3'])

df_group.plot(kind='bar', 
              rot=0,
              colormap='Paired',
              edgecolor='black',
              title='地区季度对比')
plt.savefig('pandas_bar.png')
自动生成图例和分组标签

3)绘制饼图

制作圆形饼图。

# juzicode.com/VX公众号:juzicode
pivot_df = pd.pivot_table(df, 
                         values='D',
                         index=pd.cut(df['A'],5),
                         columns=pd.cut(df['B'],5))

pivot_df.plot(kind='heatmap', 
              cmap='YlGnBu',
              title='数据交叉热力图')
plt.savefig('pandas_heatmap.png')

4)制作箱体图

制作箱体图

# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.family'] =  ['YouYuan']   
plt.rcParams['axes.unicode_minus'] = False  
import numpy as np

weight = np.random.rand(6,3)*100
fruit=['桔子', '橙子', '西瓜', '苹果', '香蕉', '西红柿']
attri = ['重量','体积','单价']
columns=pd.Index(attri,name='属性')
df = pd.DataFrame(weight,index=fruit,columns=columns)
print('df=\n',df)
df.plot.box()  
plt.savefig('7pandas_box.png')

5)交互式探索

结合Jupyter实现动态分析,在jupyter中运行后,会显示columns和kind选项,选择不同的类型会出现不同的绘图,实现交互。

# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] =  ['YouYuan']   
plt.rcParams['axes.unicode_minus'] = False  
from ipywidgets import interact

df = pd.DataFrame(np.random.randn(1000, 4), columns=list('ABCD'))
@interact(column=list('ABCD'), 
          kind=['line','bar','area','hist'])
def dynamic_plot(column='A', kind='line'):
    df[column].plot(kind=kind, title=f'{column}列可视化')
    plt.show()
自动生成坐标标签和颜色映射

6)样式高级定制

保持简洁语法的同时深度定制。

# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] =  ['YouYuan']   
plt.rcParams['axes.unicode_minus'] = False  

data = {
    '城市': ['北京', '上海', '广州', '北京', '上海', '广州'],
    '月份': [1,1,1,2,2,2],
    '销售额': [100, 150, 80, 230, 180, 90]
}
df = pd.DataFrame(data)
df_group = df.groupby('城市').sum().reset_index()

ax = df_group.plot(
    figsize=(10,6),
    style={'北京':'s-', '上海':'D--', '广州':'o:'},
    x='城市', y='销售额',  # 明确坐标轴字段
    title='销售趋势对比'
)

ax.set_facecolor('#F5F5F5')
ax.grid(linestyle=':', linewidth=0.8)
ax.legend(loc='upper left', framealpha=0.5)
ax.annotate('峰值', xy=(1,230),  # 调整坐标为实际数据范围
            xytext=(0.5,250),
            arrowprops=dict(facecolor='red', shrink=0.05))
plt.savefig('6pandas_style.png')
基础图表+高级标注示例

7)数据分布分析

结合 subplots(),生成多种分布图表。

# juzicode.com/VX公众号:juzicode
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] =  ['YouYuan']   
plt.rcParams['axes.unicode_minus'] = False  

df = pd.DataFrame(np.random.randn(1000, 4), columns=list('ABCD'))

fig, axes = plt.subplots(2, 2, figsize=(12,8))
df['A'].plot.hist(ax=axes[0,0], bins=30, alpha=0.7)  # 直方图
df.plot.scatter(ax=axes[0,1], x='A', y='B')          # 散点图
df['C'].plot.kde(ax=axes[1,0])                      # 密度图
df.plot.box(ax=axes[1,1])                           # 箱线图
plt.tight_layout()
plt.savefig('pandas_dist.png')
多种分布图表组合分析

总结

Pandas plot核心优势:

  • DataFrame原生集成,避免数据转换
  • 自动处理索引和标签
  • 内置多种可视化类型(hexbin/barh等)

注意事项:

  • 复杂图表仍需结合Matplotlib API
  • 大数据集建议先抽样再绘图
  • 使用subplots=True参数自动分面绘图

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注