.plot() 方法绘制各种图形,并进行基础定制。
首先导入必要的库,并创建一些示例数据用于绘图演示。
import pandas as pd
import numpy as np
# 设置中文显示(如果需要)
# plt.rcParams['font.sans-serif'] = ['SimHei'] # 根据系统调整
# 创建时间序列数据
dates = pd.date_range('2024-01-01', periods=100, freq='D')
ts = pd.Series(np.random.randn(100).cumsum(), index=dates, name='Value')
# 创建分类汇总数据
df = pd.DataFrame({
'类别': ['A', 'B', 'C', 'D'],
'数值': [23, 45, 56, 78],
'占比': [0.15, 0.30, 0.25, 0.30]
})
# 创建随机数据框
df_scatter = pd.DataFrame(np.random.randn(50, 4), columns=['A', 'B', 'C', 'D'])
折线图是时间序列最常用的图表,Series.plot() 和 DataFrame.plot() 默认都绘制折线图。
# Series 折线图
ts.plot(figsize=(10, 5), title='随机游走序列')
plt.ylabel('值')
plt.show()
# DataFrame 多列折线图
df_scatter.plot(figsize=(10, 5), title='多条折线')
plt.legend(loc='best')
plt.show()
通过指定 kind='bar' 或 kind='barh' 可以绘制垂直或水平柱状图。
# 垂直柱状图
df.plot(x='类别', y='数值', kind='bar', title='各类别数值', legend=False)
# 水平柱状图
df.plot(x='类别', y='数值', kind='barh', title='水平柱状图')
# 多列分组柱状图
df.set_index('类别')[['数值', '占比']].plot(kind='bar', title='分组柱状图')
直方图用于查看数据分布,使用 kind='hist'。
# 单列直方图
ts.plot(kind='hist', bins=20, title='值分布', alpha=0.7)
# 多列直方图
df_scatter.plot(kind='hist', bins=20, alpha=0.5, title='多列分布叠加')
# 密度图(核密度估计)
df_scatter.plot(kind='kde', title='密度图')
散点图用于查看两个数值变量之间的关系,需要指定 x 和 y 列。
# 创建两列数据
scatter_data = pd.DataFrame({'X': np.random.randn(100), 'Y': np.random.randn(100)})
scatter_data.plot(kind='scatter', x='X', y='Y', title='散点图')
# 可以通过 c 参数指定颜色列,s 指定大小
scatter_data['颜色'] = np.random.choice(['red','blue','green'], 100)
scatter_data['大小'] = np.random.randint(20, 200, 100)
# 注意:Pandas 绘图对颜色列支持有限,建议用 matplotlib 定制
箱线图展示数据的五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值)以及异常值。
# 单列箱线图
df_scatter[['A', 'B']].plot(kind='box', title='箱线图')
# 也可以使用 DataFrame.boxplot() 方法
df_scatter.boxplot(column=['A','B','C'])
面积图类似于折线图,但填充了折线与轴之间的区域,适合展示累积量。
# 创建累积数据
area_data = pd.DataFrame(np.random.rand(10, 4), columns=['A','B','C','D'])
area_data.plot(kind='area', stacked=True, alpha=0.5, title='面积图')
# 非堆叠
area_data.plot(kind='area', stacked=False, alpha=0.5)
.plot() 方法支持许多常用参数,用于定制图表外观。
# 示例:自定义折线图
ts.plot(
figsize=(12, 4),
title='自定义折线图',
color='red',
linestyle='--',
linewidth=2,
grid=True,
fontsize=12,
rot=45
)
plt.xlabel('日期')
plt.ylabel('数值')
plt.show()
使用 subplots=True 可以将多列数据分别绘制在不同的子图中。
df_scatter.plot(subplots=True, figsize=(10, 8), layout=(2,2), title='各列子图')
plt.tight_layout()
plt.show()
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 生成模拟销售数据
sales = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=90, freq='D'),
'产品A': np.random.randint(50, 150, 90).cumsum(),
'产品B': np.random.randint(30, 100, 90).cumsum(),
'产品C': np.random.randint(20, 80, 90).cumsum(),
'折扣': np.random.choice([0.9, 1.0, 0.8], 90)
})
sales.set_index('日期', inplace=True)
print(sales.head())
# 1. 绘制三个产品的销售趋势折线图
ax = sales[['产品A', '产品B', '产品C']].plot(figsize=(12, 5), title='产品销售趋势')
ax.set_ylabel('累计销售额')
plt.show()
# 2. 绘制折扣的柱状分布
sales['折扣'].value_counts().sort_index().plot(kind='bar', title='折扣分布')
# 3. 绘制产品A的直方图
sales['产品A'].plot(kind='hist', bins=15, title='产品A销售额分布', alpha=0.6)
# 4. 绘制产品A与产品B的散点图(查看相关性)
sales.plot(kind='scatter', x='产品A', y='产品B', title='产品A vs 产品B')
# 5. 绘制每日销售总量(各产品相加)的面积图
sales[['产品A', '产品B', '产品C']].sum(axis=1).plot(kind='area', title='每日总销售趋势', alpha=0.5)
plt.show()
plt.rcParams['font.sans-serif'] = ['SimHei'] 并设置 plt.rcParams['axes.unicode_minus'] = False。
plt 进行更精细的控制,例如添加标签、调整图例等。
plt.show() 显示图形;在 Jupyter Notebook 中通常自动显示。
figsize 控制图表大小,避免重叠。