在Matplotlib中将散点图添加到箱线图
参考: Adding a scatter of points to a boxplot using Matplotlib
在数据可视化中,箱线图(Boxplot)和散点图(Scatter Plot)是两种常用的图表类型,它们各自展示了数据的不同方面。箱线图主要用于展示数据的分布情况,包括中位数、四分位数以及异常值。而散点图则用于显示两个变量之间的关系。将散点图添加到箱线图中,可以更直观地展示数据点的具体分布,尤其是异常值的位置。本文将详细介绍如何在Python的Matplotlib库中实现这一功能。
1. 基础箱线图
首先,我们需要了解如何在Matplotlib中创建一个基础的箱线图。以下是一个简单的示例:
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
data = np.random.normal(0, 1, size=100)
fig, ax = plt.subplots()
ax.boxplot(data)
ax.set_title('Basic Boxplot - how2matplotlib.com')
plt.show()
Output:
2. 添加散点图
接下来,我们将在箱线图的基础上添加散点图。这可以通过使用scatter()
函数实现。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
data = np.random.normal(0, 1, size=100)
fig, ax = plt.subplots()
ax.boxplot(data)
ax.scatter(np.ones(data.shape[0]), data, color='red', alpha=0.5)
ax.set_title('Boxplot with Scatter - how2matplotlib.com')
plt.show()
Output:
3. 自定义散点图样式
我们可以通过调整scatter()
函数的参数来自定义散点图的样式,如颜色、大小、透明度等。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
data = np.random.normal(0, 1, size=100)
fig, ax = plt.subplots()
ax.boxplot(data)
ax.scatter(np.ones(data.shape[0]), data, color='blue', alpha=0.3, edgecolor='black', s=50)
ax.set_title('Customized Scatter on Boxplot - how2matplotlib.com')
plt.show()
Output:
4. 多组数据的箱线图与散点图
当我们有多组数据时,可以同时为每组数据生成箱线图和散点图。
import matplotlib.pyplot as plt
import numpy as np
# 生成多组随机数据
data1 = np.random.normal(0, 1, size=100)
data2 = np.random.normal(1, 1.5, size=100)
fig, ax = plt.subplots()
ax.boxplot([data1, data2], positions=[1, 2])
ax.scatter(np.ones(data1.shape[0]), data1, color='green', alpha=0.5)
ax.scatter(np.ones(data2.shape[0])*2, data2, color='purple', alpha=0.5)
ax.set_title('Multiple Boxplots with Scatter - how2matplotlib.com')
plt.show()
Output:
5. 使用不同的标记符号
在散点图中,我们可以使用不同的标记符号来区分不同的数据点。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
data = np.random.normal(0, 1, size=100)
fig, ax = plt.subplots()
ax.boxplot(data)
ax.scatter(np.ones(data.shape[0]), data, marker='^', color='magenta', alpha=0.5)
ax.set_title('Scatter with Different Markers - how2matplotlib.com')
plt.show()
Output:
6. 调整箱线图和散点图的布局
有时候我们需要调整箱线图和散点图的布局,以便更好地展示数据。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
data = np.random.normal(0, 1, size=100)
fig, ax = plt.subplots()
box = ax.boxplot(data, patch_artist=True)
for patch in box['boxes']:
patch.set(facecolor='yellow')
ax.scatter(np.ones(data.shape[0]), data, color='black', alpha=0.7)
ax.set_title('Adjusted Layout Boxplot and Scatter - how2matplotlib.com')
plt.show()
Output:
7. 散点图的颜色渐变
我们可以根据数据点的值设置散点图的颜色渐变,以增加视觉效果。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
data = np.random.normal(0, 1, size=100)
fig, ax = plt.subplots()
ax.boxplot(data)
colors = data - np.min(data)
scatter = ax.scatter(np.ones(data.shape[0]), data, c=colors, cmap='viridis')
plt.colorbar(scatter)
ax.set_title('Gradient Color Scatter on Boxplot - how2matplotlib.com')
plt.show()
Output:
8. 添加多个散点图层
有时候我们需要在同一个箱线图上添加多个散点图层,以表示不同的数据集或条件。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
data1 = np.random.normal(0, 1, size=100)
data2 = np.random.normal(0, 2, size=100)
fig, ax = plt.subplots()
ax.boxplot(data1)
ax.scatter(np.ones(data1.shape[0]), data1, color='red', alpha=0.5)
ax.scatter(np.ones(data2.shape[0]), data2, color='blue', alpha=0.5)
ax.set_title('Multiple Layers of Scatter on Boxplot - how2matplotlib.com')
plt.show()
Output:
9. 结合箱线图和散点图的高级技巧
最后,我们可以结合箱线图和散点图的高级技巧,例如添加统计注释或使用不同的数据表示方法。
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
# 生成随机数据
data = np.random.normal(0, 1, size=100)
fig, ax = plt.subplots()
sns.boxplot(data=data, ax=ax, color='lightblue')
sns.swarmplot(data=data, ax=ax, color='darkblue')
ax.set_title('Advanced Boxplot and Scatter Techniques - how2matplotlib.com')
plt.show()
Output:
以上示例使用了Seaborn库来增强视觉效果,其中boxplot
函数用于绘制箱线图,而swarmplot
则用于在箱线图上添加不重叠的散点图,这样可以更清晰地展示每个数据点的位置。
总结
在本文中,我们详细介绍了如何在Matplotlib中将散点图添加到箱线图。我们从基础的箱线图开始,逐步介绍了如何添加散点图,以及如何自定义散点图的样式和布局。我们还探讨了如何处理多组数据,使用不同的标记符号,以及如何实现散点图的颜色渐变和多层散点图。最后,我们还介绍了一些高级技巧,如结合箱线图和散点图的统计注释和交互式可视化。