在本文中,我将介绍如何使用 Pandas Plot 生成常见类型的图表,而无需 Matplotlib。实际上,Pandas Plot 在后台使用了 Matplotlib 对象。然而,方便之处在于,我们可以使用一行代码非常轻松地从数据框中绘图。
当然,如果只使用 Pandas Plot,会有很多限制。所以我建议只在足够的情况下使用它。在最后一节中,我还将给出一些 Pandas Plot 无法帮助的场景。希望本文对您有所帮助。
1. 样本数据集
通常,我的文章都是从安装库开始的。但是,对于 Pandas,我们可以跳过它,因为它太常见了。此外,在大多数环境中,例如 Google Colab 或 Databricks,环境中已经有 Pandas 库。
让我们创建一个示例数据集,可用于本教程中的演示目的。
为了方便起见,我们可以使用 Numpy 来生成随机数。请注意,在实际的数据可视化用例中,我们甚至不需要 Numpy。
import pandas as pd
import numpy as np
# If you want to reproduce exactly the same results
np.random.seed(123)
# Generate sample data
data = {
'Date': pd.date_range(start='1/1/2024', periods=100),
'Product_A_Sales': np.random.randint(50, 200, 100),
'Product_B_Sales': np.random.randint(30, 150, 100),
'Temperature': np.round(np.random.normal(25, 5, 100), 2),
'City': np.random.choice(['Sydney', 'Melbourne', 'Adelaide', 'Brisbane', 'Perth'], 100),
'Revenue': np.random.randint(500, 1000, 100),
'Profit': np.random.randint(50, 200, 100)
}
df = pd.DataFrame(data)
# Show sample
df.head()
这seed(123)
是可选的。但是,如果您想尝试本文中的所有示例并期望获得相同的结果,请使用相同的种子数。因此,我们将生成的随机数将是相同的。
因此,我们的数据集是一个模拟宽表,其中包含日期、产品销售统计数据和温度等其他特征。
2. 使用 Pandas 进行绘图及技巧
所有数据可视化教程都从折线图开始,因为它们是最基本的类型。让我们看看如何仅使用 Pandas 创建折线图。
假设我们想绘制产品 A 随时间变化的销售趋势。这很简单,如下所示。
df.plot(kind='line', x='Date', y='Product_A_Sales', title='Product A Sales Over Time');
当我们plot()
从数据框调用该方法时,我们只需告诉它我们需要一个折线图kind='line'
,然后告诉它 x 轴和 y 轴是什么。没有太多例子。太简单了。
但是,你有没有注意到,输出结果很丑陋<Axes:...>
?这是因为 Pandas 使用 Matplotlib 在后台生成图表。即使我们不必导入 Matplotlib 并调用它,该方法df.plot()
仍然会生成Axes
对象。这意味着,在 Jupyter Notebook 或类似 iPython 的环境中,如果我们不plt.show()
从 Matplotlib 调用,输出结果将始终如此丑陋。
是真的吗?不完全是 :)
在 Jupyter Notebook 环境中,我们可以使用分号;
来抑制单元格中对象的输出。例如,你一定知道我们可以直接输出对象值,如下所示。
但是,如果我们添加分号,对象就不会被输出。
类似地,我们也可以使用该技巧来抑制 Pandas 图的丑陋输出。
3.Pandas Plot 提供哪些功能?
除了上面演示的折线图之外,Pandas Plot 支持大多数常见的图表类型,如上图所示。我只会将代码和示例图表放在下面。
# 1-1 Grouped Bar Chart
df.groupby('City')[['Product_A_Sales', 'Product_B_Sales']].mean().plot(kind='bar', title='Average Sales by City', figsize=(10, 6));
# 1-2 Horizontal Bar Chart
df.groupby('City')['Revenue'].mean().plot(kind='barh', title='Average Revenue by City', figsize=(10, 6), color='skyblue');
# 2-1 Scatter Chart
df.plot(kind='scatter', x='Temperature', y='Product_A_Sales', title='Product A Sales vs Temperature', figsize=(10, 6));
# 2-2 Histogram
df['Temperature'].plot(kind='hist', bins=20, title='Temperature Distribution', figsize=(10, 6));
# 3-1 Stacked Area Chart
df[['Product_A_Sales', 'Product_B_Sales']].plot(kind='area', title='Product Sales Over Time', figsize=(10, 6), alpha=0.5);
# 3-2 Pie Chart
df['City'].value_counts().plot(kind='pie', title='Distribution by City', figsize=(8, 8), autopct='%1.1f%%', startangle=90);
您可能注意到我使用了 Matplotlib 的一些参数。同样,由于 Pandas Plot 在后台使用 Matplotlib,因此所有这些图表类型及其配置都与 Matplotlib 完全相同。
例如,figsize()
可以帮助定义图形的大小,color
可以帮助自定义颜色代码,并且autopct
可以标准化饼图中百分比的小数。
Matplotlib 文档中提供了所有内容,因此我不会在本文中重复。
4. Pandas 在数据可视化方面的局限性
在正常的 EDA 活动中,我相信 Pandas Plot 函数足以应付大多数场景。但是,有些场景会达到它的极限。在以下情况下,我们可能必须使用 Matplotlib 或其他可视化库。
需要高级样式和格式
当我们需要更高级的样式和格式时,Pandas 图有时无法满足。假设我们想在图表中添加一些注释,例如在散点图中突出显示最高销售价值。
# Pandas Plot Scatter
df.plot(kind='scatter', x='Temperature', y='Product_A_Sales', title='Product A Sales vs Temperature');
# Matplotlib with Annotation
import matplotlib.pyplot as plt
ax = df.plot(kind='scatter', x='Temperature', y='Product_A_Sales', title='Product A Sales vs Temperature')
ax.annotate('Highest Sales', xy=(df['Temperature'].max(), df['Product_A_Sales'].max()), xytext=(30, 180),
arrowprops=dict(facecolor='gold', shrink=0.05))
plt.show()
专业图表类型
当我们需要特殊类型的图表时,Pandas 图可能无法提供帮助,尽管它具有大多数常见类型。例如,Pandas 图可以生成箱线图来展示销售分布。然而,小提琴图可以更好地说明分布。后者可直接从 Seaborn 库中获得。
# Pandas Plot Box Plot
df.boxplot(column='Product_A_Sales', by='City', grid=False);
# Seaborn Violin Plot
import seaborn as sns
import matplotlib.pyplot as plt
sns.violinplot(x='City', y='Product_A_Sales', data=df)
plt.title('Violin Plot of Product A Sales by City')
plt.show()
交互性
Pandas 图表是静态的。这意味着,当我们希望可视化更具交互性时,我们必须寻找替代方案,例如鼠标悬停提示和平移手势。Plotly 是我最喜欢的用于生成交互式数据可视化的库之一。
import plotly.express as px
fig = px.scatter(df, x='Temperature', y='Product_A_Sales', title='Product A Sales vs Temperature', hover_data=['Date', 'City'])
fig.show()
结论
总而言之,很高兴知道 Pandas 可以非常轻松地在任何数据框中绘制我们的数据。因此,在大多数情况下,我们可能不需要使用其他库,包括 Matplotlib。这将使我们的日常 EDA 工作变得更加轻松,因为即使一行代码就足够了。当然,Pandas Plot 无法实现很多功能,本文也对此进行了详细说明。我希望这篇文章会对您有所帮助。
感谢关注雲闪世界。(亚马逊aws和谷歌GCP服务协助解决云计算及产业相关解决方案)
订阅频道(https://t.me/awsgoogvps_Host)
TG交流群(t.me/awsgoogvpsHost)