Pandas-之数据可视化

数据可视化

目录


基础绘图

Pandas 使用 Matplotlib 作为绘图后端,可以通过 plot() 方法快速绘图。

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 确保图表在 Jupyter 中显示
# %matplotlib inline

# 创建示例数据
dates = pd.date_range('2024-01-01', periods=100, freq='D')
df = pd.DataFrame({
    '值': np.random.randn(100).cumsum()
}, index=dates)

# 基础绘图
df.plot()
plt.show()

折线图

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 创建时间序列数据
dates = pd.date_range('2024-01-01', periods=50, freq='D')
df = pd.DataFrame({
    '股票A': 100 + np.random.randn(50).cumsum(),
    '股票B': 100 + np.random.randn(50).cumsum(),
    '股票C': 100 + np.random.randn(50).cumsum()
}, index=dates)

# 折线图
df.plot(kind='line', figsize=(10, 6))
plt.title('股票价格走势')
plt.xlabel('日期')
plt.ylabel('价格')
plt.grid(True)
plt.legend()
plt.show()

# 只绘制特定列
df[['股票A', '股票B']].plot()
plt.show()

柱状图

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

data = {
    '产品': ['A', 'B', 'C', 'D', 'E'],
    '销售额': [1000, 1500, 1200, 1800, 900],
    '利润': [200, 300, 250, 350, 150]
}
df = pd.DataFrame(data)

# 垂直柱状图
df.plot(x='产品', y='销售额', kind='bar', figsize=(8, 6))
plt.title('产品销售')
plt.ylabel('销售额')
plt.show()

# 水平柱状图
df.plot(x='产品', y='销售额', kind='barh')
plt.show()

# 分组柱状图
df.plot(x='产品', y=['销售额', '利润'], kind='bar')
plt.show()

# 堆叠柱状图
df.plot(x='产品', y=['销售额', '利润'], kind='bar', stacked=True)
plt.show()

散点图

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'X': np.random.randn(100),
    'Y': np.random.randn(100),
    '类别': np.random.choice(['A', 'B', 'C'], 100)
})

# 散点图
df.plot(x='X', y='Y', kind='scatter', figsize=(8, 6))
plt.title('散点图')
plt.show()

# 使用不同颜色表示类别
for category in df['类别'].unique():
    subset = df[df['类别'] == category]
    plt.scatter(subset['X'], subset['Y'], label=category)
plt.legend()
plt.show()

直方图

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 创建数据
df = pd.DataFrame({
    '数值': np.random.normal(100, 15, 1000)
})

# 直方图
df['数值'].plot(kind='hist', bins=30, figsize=(8, 6))
plt.title('数值分布直方图')
plt.xlabel('数值')
plt.ylabel('频数')
plt.show()

# 密度图
df['数值'].plot(kind='density', figsize=(8, 6))
plt.title('数值分布密度图')
plt.show()

# 多个直方图
df2 = pd.DataFrame({
    '组A': np.random.normal(100, 15, 1000),
    '组B': np.random.normal(120, 20, 1000)
})
df2.plot(kind='hist', bins=30, alpha=0.7, figsize=(8, 6))
plt.show()

箱线图

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame({
    '组A': np.random.normal(100, 15, 100),
    '组B': np.random.normal(120, 20, 100),
    '组C': np.random.normal(110, 18, 100)
})

# 箱线图
df.plot(kind='box', figsize=(8, 6))
plt.title('箱线图')
plt.ylabel('数值')
plt.show()

# 垂直箱线图
df.boxplot(figsize=(8, 6))
plt.show()

其他图表类型

面积图

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

dates = pd.date_range('2024-01-01', periods=30, freq='D')
df = pd.DataFrame({
    '系列A': np.random.randn(30).cumsum(),
    '系列B': np.random.randn(30).cumsum()
}, index=dates)

# 面积图
df.plot(kind='area', figsize=(10, 6), alpha=0.7)
plt.title('面积图')
plt.show()

饼图

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt

data = {
    '类别': ['A', 'B', 'C', 'D'],
    '数值': [30, 25, 20, 25]
}
df = pd.DataFrame(data)

# 饼图
df.plot(x='类别', y='数值', kind='pie', autopct='%1.1f%%', figsize=(8, 8))
plt.ylabel('')
plt.title('饼图')
plt.show()

# 使用 Series
s = pd.Series([30, 25, 20, 25], index=['A', 'B', 'C', 'D'])
s.plot(kind='pie', autopct='%1.1f%%')
plt.show()

图表自定义

基本自定义

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

dates = pd.date_range('2024-01-01', periods=50, freq='D')
df = pd.DataFrame({
    '值': np.random.randn(50).cumsum()
}, index=dates)

ax = df.plot(figsize=(12, 6),
            title='自定义图表',
            color='red',
            linestyle='--',
            linewidth=2,
            marker='o',
            markersize=4)

ax.set_xlabel('日期', fontsize=12)
ax.set_ylabel('数值', fontsize=12)
ax.grid(True, alpha=0.3)
ax.legend(['数据系列'], fontsize=10)
plt.tight_layout()
plt.show()

多子图

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

dates = pd.date_range('2024-01-01', periods=50, freq='D')
df = pd.DataFrame({
    '系列A': np.random.randn(50).cumsum(),
    '系列B': np.random.randn(50).cumsum(),
    '系列C': np.random.randn(50).cumsum()
}, index=dates)

# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 在子图上绘图
df['系列A'].plot(ax=axes[0, 0], title='系列A')
df['系列B'].plot(ax=axes[0, 1], title='系列B')
df['系列C'].plot(ax=axes[1, 0], title='系列C')
df.plot(ax=axes[1, 1], title='所有系列')

plt.tight_layout()
plt.show()

实际应用示例

示例 1:股票数据分析可视化

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 创建股票数据
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100, freq='D')
stock_prices = 100 * np.cumprod(1 + np.random.randn(100) * 0.02)

df = pd.DataFrame({
    '收盘价': stock_prices,
    '成交量': np.random.randint(1000000, 5000000, 100)
}, index=dates)

# 计算移动平均
df['5日均线'] = df['收盘价'].rolling(window=5).mean()
df['20日均线'] = df['收盘价'].rolling(window=20).mean()

# 创建双轴图
fig, ax1 = plt.subplots(figsize=(12, 6))

# 左轴:价格
ax1.set_xlabel('日期')
ax1.set_ylabel('价格', color='black')
ax1.plot(df.index, df['收盘价'], label='收盘价', color='blue')
ax1.plot(df.index, df['5日均线'], label='5日均线', color='orange')
ax1.plot(df.index, df['20日均线'], label='20日均线', color='green')
ax1.tick_params(axis='y', labelcolor='black')
ax1.legend(loc='upper left')
ax1.grid(True, alpha=0.3)

# 右轴:成交量
ax2 = ax1.twinx()
ax2.set_ylabel('成交量', color='gray')
ax2.bar(df.index, df['成交量'], alpha=0.3, color='gray')
ax2.tick_params(axis='y', labelcolor='gray')

plt.title('股票价格和成交量分析')
plt.tight_layout()
plt.show()

示例 2:销售数据可视化

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 创建销售数据
np.random.seed(42)
months = pd.date_range('2024-01-01', periods=12, freq='M')
sales = pd.DataFrame({
    '产品A': np.random.randint(1000, 5000, 12),
    '产品B': np.random.randint(1500, 6000, 12),
    '产品C': np.random.randint(800, 4000, 12)
}, index=months)

# 创建多个图表
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# 1. 月度销售额趋势
sales.plot(ax=axes[0, 0], title='月度销售额趋势', marker='o')
axes[0, 0].set_xlabel('月份')
axes[0, 0].set_ylabel('销售额')
axes[0, 0].legend()

# 2. 柱状图
sales.sum().plot(kind='bar', ax=axes[0, 1], title='年度总销售额')
axes[0, 1].set_xlabel('产品')
axes[0, 1].set_ylabel('总销售额')
axes[0, 1].tick_params(axis='x', rotation=45)

# 3. 堆叠面积图
sales.plot(kind='area', ax=axes[1, 0], title='销售额堆叠', alpha=0.7)
axes[1, 0].set_xlabel('月份')
axes[1, 0].set_ylabel('销售额')
axes[1, 0].legend()

# 4. 饼图(年度总计)
sales.sum().plot(kind='pie', ax=axes[1, 1], autopct='%1.1f%%', title='产品销售占比')
axes[1, 1].set_ylabel('')

plt.tight_layout()
plt.show()

总结

Pandas 提供了便捷的数据可视化功能:

  1. plot() 方法:快速绘图
  2. 多种图表类型:折线图、柱状图、散点图、直方图、箱线图等
  3. 图表自定义:颜色、样式、标签等
  4. 多子图:在一个图中显示多个图表
  5. 双轴图:显示不同量纲的数据

相关推荐
职业码农NO.11 小时前
智能体推理范式: Plan-and-Execute(规划与执行)
人工智能·python·数据分析·系统架构·知识图谱·agent·集成学习
墨上烟雨6 小时前
Pandas 数据结构 - Series
数据结构·pandas
Access开发易登软件7 小时前
Access开发实战:绘制漏斗图实现业务转化分析
数据库·信息可视化·html·vba·图表·access
Elastic 中国社区官方博客8 小时前
Kibana 数据可视化的新配色方案 —— 我们如何以及为什么创建它
大数据·elasticsearch·搜索引擎·信息可视化·全文检索·kibana
咕噜企业分发小米10 小时前
阿里云基因测序数据分析平台有哪些成功案例?
阿里云·数据分析·云计算
中渝软通10 小时前
中小企业数字化新标杆:“二级达标”技术解析与实施策略
信息可视化
狮智先生10 小时前
【编程实践】PySide6 + Plotly + Pandas 开发HTML数据分析报告
程序人生·plotly·html·pandas
CryptoPP11 小时前
印度股票市场数据获取与分析实战:基于RESTful API与Python
数据挖掘·数据分析
过期的秋刀鱼!11 小时前
Excel-数据分析开发心得(工具PQ,PP)与开发经验
大数据·数据分析·excel·模型搭建·数据优化·powerquery·powerpivot
大数据魔法师11 小时前
曲靖天气数据分析与挖掘(二)- 曲靖天气数据预处理
数据挖掘·数据分析