这篇文章中,我们将通过一个模拟的“Iris数据集”来演示如何用Python进行数据可视化,帮助你掌握一些常见的数据示意图的绘图方法。😊
1. 导入必要的库
在开始绘图之前,我们需要导入一些常用的Python库。我们将使用pandas
来处理数据,numpy
用于生成随机数据,matplotlib
和seaborn
则是进行绘图的核心工具。下面是我们导入的库:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
from pandas.plotting import andrews_curves, parallel_coordinates, radviz
这些库的组合使我们能够对数据进行高效的处理和可视化。通过设定警告忽略,我们可以避免冗长的警告信息干扰我们的分析。
warnings.filterwarnings("ignore")
2. 模拟数据集
为了演示,我们随机生成了一组模拟数据,模仿了经典的Iris数据集。数据集包含了150个样本,涉及到萼片和花瓣的长度与宽度信息,并且将样本随机分配为三种花的种类:Setosa
、Versicolor
和Virginica
。我们用numpy
的正态分布来模拟特征的变化。
np.random.seed(42)
num_samples = 150
species = np.random.choice(['Setosa', 'Versicolor', 'Virginica'], num_samples)
data = {
'SepalLengthCm': np.random.normal(5.8, 0.8, num_samples),
'SepalWidthCm': np.random.normal(3.0, 0.4, num_samples),
'PetalLengthCm': np.random.normal(3.7, 1.5, num_samples),
'PetalWidthCm': np.random.normal(1.2, 0.5, num_samples),
'Species': species
}
iris = pd.DataFrame(data)
现在,我们来看看这组数据的结构,并输出不同种类的花的数量分布:
print(iris.head()) print("每种花的数量分布:") print(iris["Species"].value_counts())
3. 1. 绘制散点图
接下来,我们通过散点图来展示萼片的长度与宽度之间的关系。在这个图中,我们可以清晰地看到不同种类花卉的分布情况:
iris.plot(kind="scatter", x="SepalLengthCm", y="SepalWidthCm", color='blue', alpha=0.5)
plt.title("萼片长和宽的散点图")
plt.show()
这个简单的散点图让我们能够快速判断萼片的长度和宽度是否存在一定的相关性。👌
3. 2. 采用Seaborn的jointplot
接下来,我们利用Seaborn的jointplot
来展示更多的信息。这种图会同时显示散点图和直方图,从而让我们能更好地理解两个变量之间的关系。
sns.jointplot(x="SepalLengthCm", y="SepalWidthCm", data=iris, height=5, kind="scatter", color="purple")
plt.show()
这个图形展示了每个数据点的分布,同时通过直方图呈现了变量的单独分布。📊
4. 3. FacetGrid — 分类展示
Seaborn的FacetGrid功能非常强大,能够在同一图表中根据分类变量分面展示不同的散点图。通过这种方式,我们可以直观地看到每个类别在特征上的分布差异。
sns.FacetGrid(iris, hue="Species", height=5) \
.map(plt.scatter, "SepalLengthCm", "SepalWidthCm") \
.add_legend()
plt.show()
每个类别都有自己独立的散点图,让不同种类之间的对比更加清晰。🎨
5. 4. 箱线图展示花瓣长度分布
接下来,我们使用箱线图来展示不同种类花瓣长度的分布。这种图形非常适合观察数据的分布范围、中心值以及异常值。
sns.boxplot(x="Species", y="PetalLengthCm", data=iris) plt.title("不同种类的花瓣长度分布") plt.show()
通过箱线图,我们能清楚地看到每种花瓣的长度分布情况以及可能存在的异常值。📦
6. 高级可视化技术
除了基本的散点图和箱线图,Seaborn还提供了很多强大的绘图功能。比如,小提琴图(Violin Plot)可以同时展示分布密度和统计摘要,KDE图(Kernel Density Estimation)则可以帮助我们更直观地了解数据的分布。
sns.violinplot(x="Species", y="PetalLengthCm", data=iris)
plt.title("小提琴图展示分布密度")
plt.show()
同时,我们也可以利用pairplot
来展示特征之间的关系,包括不同种类之间的区分:
sns.pairplot(iris, hue="Species", height=3) plt.show()
这类图表可以帮助我们从多个维度快速理解数据之间的关联。💡
7. 进阶的多维数据可视化
对于复杂的多维数据,Andrews Curves、平行坐标图和Radviz是非常有用的可视化工具。它们能够将高维数据映射到低维空间,并保持数据的结构信息。
andrews_curves(iris, "Species")
plt.title("Andrews Curves")
plt.show()
parallel_coordinates(iris, "Species")
plt.title("平行坐标图")
plt.show()
radviz(iris, "Species")
plt.title("Radviz")
plt.show()
完整代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
from pandas.plotting import andrews_curves, parallel_coordinates, radviz
# 忽略警告
warnings.filterwarnings("ignore")
# 设置 Seaborn 的主题和样式
sns.set(style="white", color_codes=True)
# 随机生成数据,模拟 Iris 数据集
np.random.seed(42) # 设置随机种子以保证结果一致
num_samples = 150 # 样本数
species = np.random.choice(['Setosa', 'Versicolor', 'Virginica'], num_samples) # 随机生成类别
# 各特征随机生成(使用正态分布模拟不同特征的变化)
data = {
'SepalLengthCm': np.random.normal(5.8, 0.8, num_samples), # 萼片长度
'SepalWidthCm': np.random.normal(3.0, 0.4, num_samples), # 萼片宽度
'PetalLengthCm': np.random.normal(3.7, 1.5, num_samples), # 花瓣长度
'PetalWidthCm': np.random.normal(1.2, 0.5, num_samples), # 花瓣宽度
'Species': species # 种类
}
# 构建 DataFrame
iris = pd.DataFrame(data)
# 查看随机生成数据的结构
print(iris.head())
# 让我们用 value_counts 看一下每种花的数量
print("每种花的数量分布:")
print(iris["Species"].value_counts())
# 1. 使用 .plot 做散点图
iris.plot(kind="scatter", x="SepalLengthCm", y="SepalWidthCm", color='blue', alpha=0.5)
plt.title("萼片长和宽的散点图")
plt.show()
# 2. Seaborn jointplot 显示散点图和直方图
sns.jointplot(x="SepalLengthCm", y="SepalWidthCm", data=iris, height=5, kind="scatter", color="purple")
plt.show()
# 3. 使用 Seaborn 的 FacetGrid 标记不同种类
sns.FacetGrid(iris, hue="Species", height=5) \
.map(plt.scatter, "SepalLengthCm", "SepalWidthCm") \
.add_legend()
plt.show()
# 4. Seaborn boxplot 箱线图
sns.boxplot(x="Species", y="PetalLengthCm", data=iris)
plt.title("不同种类的花瓣长度分布")
plt.show()
# 5. Seaborn stripplot 加散点
ax = sns.boxplot(x="Species", y="PetalLengthCm", data=iris)
ax = sns.stripplot(x="Species", y="PetalLengthCm", data=iris, jitter=True, edgecolor="gray")
plt.title("箱线图 + 散点图")
plt.show()
# 6. 小提琴图
sns.violinplot(x="Species", y="PetalLengthCm", data=iris)
plt.title("小提琴图展示分布密度")
plt.show()
# 7. KDE 分布密度图
sns.FacetGrid(iris, hue="Species", height=6) \
.map(sns.kdeplot, "PetalLengthCm") \
.add_legend()
plt.title("花瓣长度的密度分布")
plt.show()
# 8. Pairplot 显示特征之间的关系
sns.pairplot(iris, hue="Species", height=3)
plt.show()
# 9. Pairplot 对角线的 KDE 图
sns.pairplot(iris, hue="Species", height=3, diag_kind="kde")
plt.show()
# 10. Pandas 快速绘制每个特征在不同种类下的箱线图
iris.boxplot(by="Species", figsize=(12, 6))
plt.show()
# 11. Andrews Curves (高维点转二维曲线)
andrews_curves(iris, "Species")
plt.title("Andrews Curves")
plt.show()
# 12. Parallel Coordinates (平行坐标图)
parallel_coordinates(iris, "Species")
plt.title("平行坐标图")
plt.show()
# 13. Radviz(高维点投影到二维平面)
radviz(iris, "Species")
plt.title("Radviz")
plt.show()
这些图形可以帮助你更好地理解数据中的复杂关系,尤其是在高维数据分析时,它们能够提供非常直观的视角。🚀