使用Matplotlib、Pandas和Seaborn进行数据可视化
数据可视化在数据分析和探索中起着至关重要的作用。Matplotlib、Pandas和Seaborn是Python中常用的可视化库,它们可以帮助我们快速、轻松地创建各种类型的图表。下面将介绍如何使用这些库进行数据可视化,并通过实际示例进行说明。
1. 创建示例DataFrame
首先,我们创建一个小的DataFrame,用于演示不同类型的绘图。
import pandas as pd
df = pd.DataFrame(index=['Atiya', 'Abbas', 'Cornelia',
'Stephanie', 'Monte'],
data={'Apples':[20, 10, 40, 20, 50],
'Oranges':[35, 40, 25, 19, 33]})
这个DataFrame包含了五个人对苹果和橙子的消费数据。
2. 绘制柱状图
柱状图使用索引作为x轴标签,列值作为柱子的高度。我们可以使用
plot
方法,并将
kind
参数设置为
bar
来绘制柱状图。
import matplotlib.pyplot as plt
color = ['.2', '.7']
df.plot(kind='bar', color=color, figsize=(16,4))
plt.show()
在这个例子中,我们还设置了颜色和图形的大小。
3. 绘制KDE图
KDE(Kernel Density Estimation)图忽略索引,使用每列的值作为x轴,并计算y值的概率密度。
df.plot(kind='kde', color=color, figsize=(16,4))
plt.show()
KDE图可以帮助我们了解数据的分布情况。
4. 绘制双变量图
我们可以将所有双变量图(线图、散点图和柱状图)绘制在同一个图形中。
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(16,4))
fig.suptitle('Two Variable Plots', size=20, y=1.02)
df.plot(kind='line', color=color, ax=ax1, title='Line plot')
df.plot(x='Apples', y='Oranges', kind='scatter', color=color,
ax=ax2, title='Scatterplot')
df.plot(kind='bar', color=color, ax=ax3, title='Bar plot')
plt.show()
需要注意的是,散点图需要明确指定x和y轴的列名。
5. 绘制单变量图
同样,我们可以将所有单变量图(KDE图、箱线图和直方图)绘制在同一个图形中。
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(16,4))
fig.suptitle('One Variable Plots', size=20, y=1.02)
df.plot(kind='kde', color=color, ax=ax1, title='KDE plot')
df.plot(kind='box', ax=ax2, title='Boxplot')
df.plot(kind='hist', color=color, ax=ax3, title='Histogram')
plt.show()
6. 指定绘图列
除了散点图,其他图默认使用所有数值列。我们也可以指定具体的列来进行绘图。
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(16,4))
df.sort_values('Apples').plot(x='Apples', y='Oranges',
kind='line', ax=ax1)
df.plot(x='Apples', y='Oranges', kind='bar', ax=ax2)
df.plot(x='Apples', kind='kde', ax=ax3)
plt.show()
7. 航班数据集可视化
接下来,我们将对航班数据集进行探索性数据分析,通过创建单变量和多变量图来了解数据。
7.1 读取数据集
flights = pd.read_csv('data/flights.csv')
flights.head()
7.2 计算航班状态
在绘图之前,我们需要计算转移、取消、延误和准点航班的数量。
flights['DELAYED'] = flights['ARR_DELAY'].ge(15).astype(int)
cols = ['DIVERTED', 'CANCELLED', 'DELAYED']
flights['ON_TIME'] = 1 - flights[cols].any(axis=1)
cols.append('ON_TIME')
status = flights[cols].sum()
status
7.3 绘制单变量图
我们将在同一个图形中绘制多个分类和连续列的图。
fig, ax_array = plt.subplots(2, 3, figsize=(18,8))
(ax1, ax2, ax3), (ax4, ax5, ax6) = ax_array
fig.suptitle('2015 US Flights - Univariate Summary', size=20)
ac = flights['AIRLINE'].value_counts()
ac.plot(kind='barh', ax=ax1, title='Airline')
oc = flights['ORG_AIR'].value_counts()
oc.plot(kind='bar', ax=ax2, rot=0, title='Origin City')
dc = flights['DEST_AIR'].value_counts().head(10)
dc.plot(kind='bar', ax=ax3, rot=0, title='Destination City')
status.plot(kind='bar', ax=ax4, rot=0,
log=True, title='Flight Status')
flights['DIST'].plot(kind='kde', ax=ax5, xlim=(0, 3000),
title='Distance KDE')
flights['ARR_DELAY'].plot(kind='hist', ax=ax6,
title='Arrival Delay',
range=(0,200))
plt.show()
7.4 绘制每周航班数量图
为了绘制每周航班数量图,我们需要将日期转换为时间戳。
hour = flights['SCHED_DEP'] // 100
minute = flights['SCHED_DEP'] % 100
df_date = flights[['MONTH', 'DAY']].assign(YEAR=2015,
HOUR=hour,
MINUTE=minute)
flight_dep = pd.to_datetime(df_date)
flights.index = flight_dep
fc = flights.resample('W').size()
fc.plot(figsize=(12,3), title='Flights per Week', grid=True)
plt.show()
7.5 处理缺失数据
从图中可以看出,十月份的数据缺失。我们可以使用插值方法填充缺失数据。
fc_miss = fc.where(fc > 1000)
fc_intp = fc_miss.interpolate(limit_direction='both')
ax = fc_intp.plot(color='black', figsize=(16,4))
fc_intp[fc < 500].plot(linewidth=10, grid=True,
color='.8', ax=ax)
ax.annotate(xy=(.8, .55), xytext=(.8, .77),
xycoords='axes fraction', s='missing data',
ha='center', size=20, arrowprops=dict())
ax.set_title('Flights per Week (Interpolated Missing Data)')
plt.show()
7.6 多变量绘图
我们还可以进行多变量绘图,例如找出平均飞行距离最长且总航班数不少于100的10个机场。
flights.groupby('DEST_AIR')['DIST'] \
.agg(['mean', 'count']) \
.query('count > 100') \
.sort_values('mean') \
.tail(10) \
.plot(kind='bar', y='mean', rot=0, legend=False,
title='Average Distance per Destination')
plt.show()
7.7 分析距离和飞行时间的关系
我们可以绘制距离和飞行时间的散点图,并找出异常值。
fs = flights.reset_index(drop=True)[['DIST', 'AIR_TIME']] \
.query('DIST <= 2000').dropna()
fs.plot(x='DIST', y='AIR_TIME', kind='scatter',
s=1, figsize=(16,4))
plt.show()
fs['DIST_GROUP'] = pd.cut(fs['DIST'], bins=range(0, 2001, 250))
normalize = lambda x: (x - x.mean()) / x.std()
fs['TIME_SCORE'] = fs.groupby('DIST_GROUP')['AIR_TIME'] \
.transform(normalize)
ax = fs.boxplot(by='DIST_GROUP', column='TIME_SCORE',
figsize=(16,4))
ax.set_title('Z-Scores for Distance Groups')
ax.figure.suptitle('')
plt.show()
outliers = flights.iloc[fs[fs['TIME_SCORE'] > 6].index]
outliers = outliers[['AIRLINE','ORG_AIR', 'DEST_AIR',
'AIR_TIME',
'DIST', 'ARR_DELAY', 'DIVERTED']]
outliers['PLOT_NUM'] = range(1, len(outliers) + 1)
ax = fs.plot(x='DIST', y='AIR_TIME',
kind='scatter', s=1,
figsize=(16,4), table=outliers)
outliers.plot(x='DIST', y='AIR_TIME',
kind='scatter', s=25, ax=ax, grid=True)
outs = outliers[['AIR_TIME', 'DIST', 'PLOT_NUM']]
for t, d, n in outs.itertuples(index=False):
ax.text(d + 5, t + 5, str(n))
plt.setp(ax.get_xticklabels(), y=.1)
plt.setp(ax.get_xticklines(), visible=False)
ax.set_xlabel('')
ax.set_title('Flight Time vs Distance with Outliers')
plt.show()
通过以上步骤,我们可以使用Matplotlib、Pandas和Seaborn进行各种类型的数据可视化,并对航班数据集进行深入的探索性数据分析。
下面是一个简单的流程图,展示了数据可视化的基本流程:
graph LR
A[读取数据] --> B[数据预处理]
B --> C[单变量绘图]
B --> D[多变量绘图]
C --> E[分析结果]
D --> E
表格:航班状态统计
| 状态 | 数量 |
| ---- | ---- |
| DIVERTED | 137 |
| CANCELLED | 881 |
| DELAYED | 11685 |
| ON_TIME | 45789 |
列表总结:
1. 创建示例DataFrame用于演示绘图。
2. 绘制柱状图、KDE图、双变量图和单变量图。
3. 对航班数据集进行探索性数据分析,包括计算航班状态、绘制单变量图、处理缺失数据和进行多变量绘图。
4. 找出距离和飞行时间关系中的异常值。
使用Matplotlib、Pandas和Seaborn进行数据可视化
8. 可视化方法总结与分析
在前面的内容中,我们使用了多种可视化方法对示例数据和航班数据集进行了分析。下面我们对这些方法进行总结和分析。
8.1 绘图方法对比
| 绘图类型 | 特点 | 使用场景 |
|---|---|---|
| 柱状图(Bar Plot) | 使用索引作为x轴标签,列值作为柱子高度,可直观展示不同类别之间的数量对比。 | 适用于展示分类数据的数量或频率,如航空公司、出发地和目的地城市的航班数量。 |
| KDE图(Kernel Density Estimation Plot) | 忽略索引,使用列值作为x轴,计算y值的概率密度,展示数据的分布情况。 | 用于了解连续数据的分布特征,如航班距离的分布。 |
| 线图(Line Plot) | 通过连接数据点展示数据的变化趋势。 | 适用于展示随时间或其他连续变量变化的数据趋势,如每周航班数量的变化。 |
| 散点图(Scatter Plot) | 展示两个变量之间的关系,通过点的分布来判断变量之间的相关性。 | 用于分析两个连续变量之间的关系,如航班距离和飞行时间的关系。 |
| 箱线图(Box Plot) | 展示数据的四分位数、中位数和异常值,可用于检测数据的离散程度和异常情况。 | 用于检测数据中的异常值,如不同距离组的飞行时间的异常值。 |
| 直方图(Histogram) | 将数据分成若干区间,统计每个区间内数据的频数,展示数据的分布情况。 | 适用于展示连续数据的分布,如航班到达延误时间的分布。 |
8.2 绘图参数的使用
Pandas的
plot
方法非常灵活,有很多参数可以用于定制绘图结果。例如:
-
kind
:指定绘图类型,如
bar
、
kde
、
line
等。
-
color
:设置绘图的颜色。
-
figsize
:设置图形的大小。
-
ax
:指定绘图的Axes对象,可将多个图绘制在同一个图形中。
-
title
:设置图形的标题。
-
xlim
和
ylim
:设置x轴和y轴的范围。
-
rot
:旋转x轴或y轴的刻度标签。
-
log
:设置y轴是否使用对数刻度。
此外,还可以使用
**kwds
参数传递额外的参数给底层的Matplotlib函数,如
range
参数用于直方图的范围设置。
9. 异常值分析与处理
在分析航班距离和飞行时间的关系时,我们通过分组计算每个航班的飞行时间与该组均值的标准差倍数(Z-Score),并使用箱线图检测异常值。以下是异常值分析的步骤总结:
1.
数据筛选
:选择距离小于等于2000英里的航班数据,并去除缺失值。
fs = flights.reset_index(drop=True)[['DIST', 'AIR_TIME']] \
.query('DIST <= 2000').dropna()
- 分组 :将航班距离分成8个组,每个组的范围为250英里。
fs['DIST_GROUP'] = pd.cut(fs['DIST'], bins=range(0, 2001, 250))
- 计算Z-Score :对每个组内的飞行时间进行标准化处理,计算每个航班的飞行时间与该组均值的标准差倍数。
normalize = lambda x: (x - x.mean()) / x.std()
fs['TIME_SCORE'] = fs.groupby('DIST_GROUP')['AIR_TIME'] \
.transform(normalize)
- 检测异常值 :使用箱线图展示每个距离组的Z-Score分布,并选择Z-Score大于6的航班作为异常值。
ax = fs.boxplot(by='DIST_GROUP', column='TIME_SCORE',
figsize=(16,4))
ax.set_title('Z-Scores for Distance Groups')
ax.figure.suptitle('')
outliers = flights.iloc[fs[fs['TIME_SCORE'] > 6].index]
- 标记异常值 :在散点图中标记异常值,并为每个异常值分配一个编号,方便后续分析。
outliers = outliers[['AIRLINE','ORG_AIR', 'DEST_AIR',
'AIR_TIME',
'DIST', 'ARR_DELAY', 'DIVERTED']]
outliers['PLOT_NUM'] = range(1, len(outliers) + 1)
ax = fs.plot(x='DIST', y='AIR_TIME',
kind='scatter', s=1,
figsize=(16,4), table=outliers)
outliers.plot(x='DIST', y='AIR_TIME',
kind='scatter', s=25, ax=ax, grid=True)
outs = outliers[['AIR_TIME', 'DIST', 'PLOT_NUM']]
for t, d, n in outs.itertuples(index=False):
ax.text(d + 5, t + 5, str(n))
plt.setp(ax.get_xticklabels(), y=.1)
plt.setp(ax.get_xticklines(), visible=False)
ax.set_xlabel('')
ax.set_title('Flight Time vs Distance with Outliers')
10. 总结与展望
通过使用Matplotlib、Pandas和Seaborn进行数据可视化,我们可以更直观地了解数据的特征和关系。在航班数据集的分析中,我们发现了一些有趣的现象,如不同航空公司的航班数量差异、航班距离和飞行时间的线性关系以及部分异常航班的存在。
未来的分析可以进一步深入,例如:
1.
更多变量的分析
:考虑更多的变量,如航班出发时间、天气条件等,分析它们对航班延误和飞行时间的影响。
2.
预测模型的建立
:基于现有的数据,建立预测模型,预测航班延误的概率或飞行时间。
3.
地理信息可视化
:结合地理信息系统(GIS),将航班数据可视化在地图上,更直观地展示航班的分布和流向。
下面是一个简单的流程图,展示了异常值分析的流程:
graph LR
A[数据筛选] --> B[分组]
B --> C[计算Z-Score]
C --> D[检测异常值]
D --> E[标记异常值]
列表总结:
1. 总结了不同绘图方法的特点和使用场景。
2. 分析了Pandas
plot
方法的参数使用。
3. 详细介绍了异常值分析的步骤,包括数据筛选、分组、计算Z-Score、检测异常值和标记异常值。
4. 对未来的分析方向进行了展望,包括更多变量分析、预测模型建立和地理信息可视化。
通过以上内容,我们对使用Matplotlib、Pandas和Seaborn进行数据可视化有了更深入的了解,并掌握了一些实用的数据分析和可视化技巧。希望这些内容对你有所帮助!
超级会员免费看

被折叠的 条评论
为什么被折叠?



