Matplotlib散点图绘制详解
参考:matplotlib scatter plot example
matplotlib scatter plot example
Matplotlib是Python中最流行的数据可视化库之一,它提供了强大而灵活的绘图功能。在数据分析和科学计算中,散点图是一种常用的可视化工具,用于展示两个变量之间的关系。本文将深入探讨如何使用Matplotlib绘制各种类型的散点图,从基础到高级,涵盖多种自定义选项和技巧。
1. 基础散点图
让我们从最基本的散点图开始。散点图使用plt.scatter()
函数来创建,该函数需要两个参数:x轴和y轴的数据。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)
# 创建散点图
plt.figure(figsize=(10, 6))
plt.scatter(x, y)
plt.title('Basic Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.grid(True)
plt.show()
# 打印输出结果
print("Scatter plot has been displayed.")
Output:
在这个例子中,我们首先导入了必要的库:Matplotlib的pyplot模块和NumPy。然后,我们使用NumPy的random.rand()
函数生成了50个随机数作为x和y坐标。plt.scatter(x, y)
函数创建了散点图,其中每个点的位置由x和y数组中对应的值决定。我们还添加了标题、坐标轴标签和网格线以增强可读性。
2. 自定义点的颜色和大小
散点图的一个强大特性是可以通过改变点的颜色和大小来传达额外的信息。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(100)
y = np.random.rand(100)
colors = np.random.rand(100)
sizes = 1000 * np.random.rand(100)
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')
plt.colorbar(label='Color Scale')
plt.title('Customized Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Customized scatter plot has been displayed.")
Output:
在这个例子中,我们引入了更多的自定义选项:
c=colors
:设置点的颜色,这里使用了随机生成的颜色数组。s=sizes
:设置点的大小,同样使用随机生成的大小数组。alpha=0.5
:设置点的透明度,使重叠的点更容易区分。cmap='viridis'
:指定颜色映射方案。plt.colorbar()
:添加颜色条,显示颜色与数值的对应关系。
这种方法允许我们在二维平面上展示四个维度的数据:x坐标、y坐标、颜色和大小。
3. 使用分类数据
散点图不仅可以用于连续数据,也可以用于分类数据。我们可以使用不同的颜色或标记来区分不同类别的数据点。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
categories = ['A', 'B', 'C']
colors = ['red', 'green', 'blue']
markers = ['o', 's', '^']
for cat, col, mark in zip(categories, colors, markers):
x = np.random.rand(20)
y = np.random.rand(20)
plt.scatter(x, y, c=col, marker=mark, label=cat, s=100)
plt.legend()
plt.title('Categorical Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Categorical scatter plot has been displayed.")
Output:
这个例子展示了如何为不同类别的数据使用不同的颜色和标记。我们使用循环为每个类别创建散点,并通过label
参数设置图例标签。plt.legend()
函数用于显示图例。
4. 添加误差条
在科学绘图中,经常需要显示数据点的误差范围。Matplotlib允许我们轻松地为散点图添加误差条。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.linspace(0, 10, 20)
y = 2 * x + 1 + np.random.randn(20)
xerr = 0.5 * np.random.rand(20)
yerr = 0.5 * np.random.rand(20)
plt.figure(figsize=(10, 6))
plt.errorbar(x, y, xerr=xerr, yerr=yerr, fmt='o', capsize=5, capthick=2)
plt.title('Scatter Plot with Error Bars - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Scatter plot with error bars has been displayed.")
Output:
在这个例子中,我们使用plt.errorbar()
函数来创建带有误差条的散点图。xerr
和yerr
参数分别指定x和y方向的误差大小。fmt='o'
参数指定使用圆形标记,capsize
和capthick
参数用于自定义误差条端点的外观。
5. 3D散点图
Matplotlib还支持创建三维散点图,这对于可视化三维数据非常有用。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
np.random.seed(42)
n = 100
x = np.random.rand(n)
y = np.random.rand(n)
z = np.random.rand(n)
colors = np.random.rand(n)
sizes = 1000 * np.random.rand(n)
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(x, y, z, c=colors, s=sizes, alpha=0.6, cmap='viridis')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')
ax.set_title('3D Scatter Plot - how2matplotlib.com')
plt.colorbar(scatter, label='Color Scale')
plt.show()
print("3D scatter plot has been displayed.")
Output:
这个例子展示了如何创建三维散点图。我们使用Axes3D
来创建3D坐标系,然后使用ax.scatter()
函数绘制散点。注意,我们需要为z轴提供额外的数据。
6. 气泡图
气泡图是散点图的一种变体,其中点的大小用于表示第三个变量。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)
sizes = 1000 * np.random.rand(50)
colors = np.random.rand(50)
plt.figure(figsize=(10, 6))
scatter = plt.scatter(x, y, s=sizes, c=colors, alpha=0.5, cmap='viridis')
plt.colorbar(scatter, label='Color Scale')
plt.title('Bubble Chart - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Bubble chart has been displayed.")
Output:
在这个气泡图中,点的大小由sizes
数组决定,颜色由colors
数组决定。这允许我们在二维平面上展示四个变量:x坐标、y坐标、大小和颜色。
7. 散点图矩阵
当我们需要同时查看多个变量之间的关系时,散点图矩阵非常有用。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas.plotting import scatter_matrix
np.random.seed(42)
data = {
'A': np.random.rand(100),
'B': np.random.rand(100),
'C': np.random.rand(100),
'D': np.random.rand(100)
}
df = pd.DataFrame(data)
fig, ax = plt.subplots(figsize=(12, 10))
scatter_matrix(df, alpha=0.8, diagonal='hist', ax=ax)
plt.suptitle('Scatter Plot Matrix - how2matplotlib.com', y=1.02)
plt.tight_layout()
plt.show()
print("Scatter plot matrix has been displayed.")
这个例子使用了Pandas的scatter_matrix
函数来创建散点图矩阵。对角线上显示的是每个变量的直方图,而其他位置显示变量之间的散点图。这提供了数据集中所有变量对之间关系的快速概览。
8. 带有边界框的散点图
有时我们需要在散点图中突出显示某些特定区域。我们可以通过添加边界框来实现这一点。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(100)
y = np.random.rand(100)
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.5)
# 添加边界框
plt.axvline(x=0.3, color='r', linestyle='--')
plt.axvline(x=0.7, color='r', linestyle='--')
plt.axhline(y=0.3, color='r', linestyle='--')
plt.axhline(y=0.7, color='r', linestyle='--')
plt.title('Scatter Plot with Bounding Box - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Scatter plot with bounding box has been displayed.")
Output:
在这个例子中,我们使用plt.axvline()
和plt.axhline()
函数添加了垂直和水平线,创建了一个边界框。这可以用来突出显示数据中的特定区域或范围。
9. 带有拟合线的散点图
在数据分析中,我们经常需要在散点图上添加拟合线来显示数据的趋势。
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
np.random.seed(42)
x = np.linspace(0, 10, 50)
y = 2 * x + 1 + np.random.randn(50)
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
line = slope * x + intercept
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.5)
plt.plot(x, line, color='r', label=f'y={slope:.2f}x+{intercept:.2f}')
plt.legend()
plt.title('Scatter Plot with Fit Line - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Scatter plot with fit line has been displayed.")
Output:
这个例子使用了SciPy的stats.linregress()
函数来计算最佳拟合线的斜率和截距。然后,我们使用plt.plot()
函数绘制这条线。图例显示了拟合线的方程。
10. 散点图与直方图结合
有时,我们希望在散点图的边缘显示每个变量的分布。我们可以通过结合散点图和直方图来实现这一点。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(1000)
y = x + np.random.randn(1000) * 0.5
fig, axs = plt.subplots(2, 2, figsize=(10, 10),
gridspec_kw={'width_ratios': [3, 1], 'height_ratios': [1, 3],
'wspace': 0.1, 'hspace': 0.1})
# 散点图
axs[1, 0].scatter(x, y, alpha=0.5)
axs[1, 0].set_xlabel('X-axis')
axs[1, 0].set_ylabel('Y-axis')
# X轴直方图
axs[0, 0].hist(x, bins=30, alpha=0.5)
axs[0, 0].set_xlim(axs[1, 0].get_xlim())
axs[0, 0].axis('off')
# Y轴直方图
axs[1, 1].hist(y, bins=30, orientation='horizontal', alpha=0.5)
axs[1, 1].set_ylim(axs[1, 0].get_ylim())
axs[1, 1].axis('off')
axs[0, 1].axis('off')
plt.suptitle('Scatter Plot with Histograms - how2matplotlib.com', y=0.95)
plt.show()
print("Scatter plot with histograms has been displayed.")
Output:
这个例子创建了一个2×2的子图网格,其中主要的散点图位于左下角,x轴的直方图位于上方,y轴的直方图位于右侧。这种布局提供了数据分布的全面视图。
11. 散点图与密度估计
除了直方图,我们还可以使用核密度估计(KDE)来显示数据的分布。这可以通过结合散点图和KDE图来实现。
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
np.random.seed(42)
x = np.random.randn(1000)
y = x + np.random.randn(1000) * 0.5好的,我将继续介绍更多关于Matplotlib散点图的高级技巧和应用。
```python
fig, axs = plt.subplots(2, 2, figsize=(10, 10),
gridspec_kw={'width_ratios': [3, 1], 'height_ratios': [1, 3],
'wspace': 0.1, 'hspace': 0.1})
# 散点图
axs[1, 0].scatter(x, y, alpha=0.5)
axs[1, 0].set_xlabel('X-axis')
axs[1, 0].set_ylabel('Y-axis')
# X轴KDE
kde_x = stats.gaussian_kde(x)
x_range = np.linspace(x.min(), x.max(), 100)
axs[0, 0].plot(x_range, kde_x(x_range))
axs[0, 0].set_xlim(axs[1, 0].get_xlim())
axs[0, 0].axis('off')
# Y轴KDE
kde_y = stats.gaussian_kde(y)
y_range = np.linspace(y.min(), y.max(), 100)
axs[1, 1].plot(kde_y(y_range), y_range)
axs[1, 1].set_ylim(axs[1, 0].get_ylim())
axs[1, 1].axis('off')
axs[0, 1].axis('off')
plt.suptitle('Scatter Plot with KDE - how2matplotlib.com', y=0.95)
plt.show()
print("Scatter plot with KDE has been displayed.")
这个例子创建了一个散点图,并在x轴和y轴的边缘添加了核密度估计曲线。这种方法比直方图提供了更平滑的分布视图,特别适合连续数据。
12. 散点图与回归分析
在数据分析中,我们经常需要进行回归分析并在散点图上显示回归线及其置信区间。
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 2, 100)
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
line = slope * x + intercept
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.5, label='Data')
plt.plot(x, line, color='r', label=f'Regression line (R²={r_value**2:.2f})')
# 添加置信区间
def predict(x, slope, intercept):
return slope * x + intercept
pred_y = predict(x, slope, intercept)
plt.fill_between(x, pred_y - std_err * 2, pred_y + std_err * 2, color='gray', alpha=0.2, label='95% CI')
plt.legend()
plt.title('Scatter Plot with Regression Analysis - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Scatter plot with regression analysis has been displayed.")
这个例子展示了如何在散点图上添加回归线和95%置信区间。我们使用stats.linregress()
函数进行线性回归,并计算了R²值。置信区间使用plt.fill_between()
函数绘制。
13. 带有文本标注的散点图
有时我们需要在散点图上为特定的点添加文本标注,以提供更多信息。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(20)
y = np.random.rand(20)
names = [f'Point {i}' for i in range(1, 21)]
plt.figure(figsize=(10, 6))
plt.scatter(x, y)
for i, txt in enumerate(names):
plt.annotate(txt, (x[i], y[i]), xytext=(5, 5), textcoords='offset points')
plt.title('Scatter Plot with Text Annotations - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Scatter plot with text annotations has been displayed.")
这个例子展示了如何使用plt.annotate()
函数为每个数据点添加文本标注。xytext
参数用于设置标注文本相对于数据点的偏移量。
14. 散点图与颜色映射
颜色映射可以用来表示数据点的额外维度,例如时间或某种数值属性。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(100)
y = np.random.rand(100)
colors = np.linspace(0, 1, 100)
plt.figure(figsize=(10, 6))
scatter = plt.scatter(x, y, c=colors, cmap='viridis')
plt.colorbar(scatter, label='Color Scale')
plt.title('Scatter Plot with Color Mapping - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Scatter plot with color mapping has been displayed.")
在这个例子中,我们使用了一个从0到1的线性颜色映射。颜色条显示了颜色与数值的对应关系。这种技术可以用来表示时间序列或其他连续变量。
15. 散点图与对数刻度
当数据跨越多个数量级时,使用对数刻度可以更好地展示数据分布。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(1000) * 1000
y = np.random.rand(1000) * 1000
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.5)
plt.xscale('log')
plt.yscale('log')
plt.title('Scatter Plot with Logarithmic Scales - how2matplotlib.com')
plt.xlabel('X-axis (log scale)')
plt.ylabel('Y-axis (log scale)')
plt.show()
print("Scatter plot with logarithmic scales has been displayed.")
这个例子展示了如何使用plt.xscale('log')
和plt.yscale('log')
函数将x轴和y轴设置为对数刻度。这对于可视化跨越多个数量级的数据特别有用。
16. 散点图与子图
有时我们需要在同一个图形中比较多个散点图。使用子图可以轻松实现这一点。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x1, y1 = np.random.rand(100), np.random.rand(100)
x2, y2 = np.random.rand(100), np.random.rand(100)
x3, y3 = np.random.rand(100), np.random.rand(100)
x4, y4 = np.random.rand(100), np.random.rand(100)
fig, axs = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('Multiple Scatter Plots - how2matplotlib.com', fontsize=16)
axs[0, 0].scatter(x1, y1)
axs[0, 0].set_title('Subplot 1')
axs[0, 1].scatter(x2, y2)
axs[0, 1].set_title('Subplot 2')
axs[1, 0].scatter(x3, y3)
axs[1, 0].set_title('Subplot 3')
axs[1, 1].scatter(x4, y4)
axs[1, 1].set_title('Subplot 4')
for ax in axs.flat:
ax.set(xlabel='X-axis', ylabel='Y-axis')
plt.tight_layout()
plt.show()
print("Multiple scatter plots have been displayed.")
这个例子创建了一个2×2的子图网格,每个子图包含一个不同的散点图。这种布局允许我们在同一个图形中比较多个数据集。
17. 散点图与条件格式化
我们可以根据某些条件来格式化散点图中的点,例如根据点的位置来改变其颜色或大小。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(200)
y = np.random.rand(200)
colors = np.where((x > 0.5) & (y > 0.5), 'red', 'blue')
sizes = np.where((x < 0.3) | (y < 0.3), 100, 20)
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c=colors, s=sizes, alpha=0.6)
plt.title('Scatter Plot with Conditional Formatting - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Scatter plot with conditional formatting has been displayed.")
在这个例子中,我们使用np.where()
函数根据x和y的值来设置点的颜色和大小。这种技术可以用来突出显示满足特定条件的数据点。
18. 散点图与动画
Matplotlib还支持创建动画散点图,这对于展示随时间变化的数据非常有用。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
np.random.seed(42)
n_points = 100
x = np.random.rand(n_points)
y = np.random.rand(n_points)
fig, ax = plt.subplots(figsize=(10, 6))
scatter = ax.scatter(x, y)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_title('Animated Scatter Plot - how2matplotlib.com')
def update(frame):
global x, y
x += np.random.randn(n_points) * 0.01
y += np.random.randn(n_points) * 0.01
scatter.set_offsets(np.c_[x, y])
return scatter,
anim = FuncAnimation(fig, update, frames=200, interval=50, blit=True)
plt.show()
print("Animated scatter plot has been displayed.")
这个例子创建了一个动画散点图,其中点的位置在每一帧都会稍微改变。FuncAnimation
类用于创建动画,update
函数定义了每一帧的变化。
19. 散点图与自定义标记
Matplotlib提供了多种标准标记,但有时我们可能需要使用自定义标记来表示特定的数据点。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)
custom_marker = [(-1, -1), (1, -1), (1, 1), (-1, 1), (-1, -0.5), (1, 0.5), (-1, -1)]
plt.figure(figsize=(10, 6))
plt.scatter(x, y, marker=custom_marker, s=200, facecolors='none', edgecolors='blue')
plt.title('Scatter Plot with Custom Markers - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Scatter plot with custom markers has been displayed.")
在这个例子中,我们定义了一个自定义标记,它是一个不规则的六边形。通过将这个自定义标记传递给marker
参数,我们可以使用它来代替标准标记。
20. 散点图与数据分组
当我们有分类数据时,我们可能想要根据类别来分组散点图。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
np.random.seed(42)
n = 50
df = pd.DataFrame({
'x': np.random.rand(3*n),
'y': np.random.rand(3*n),
'group': np.repeat(['A', 'B', 'C'], n)
})
fig, ax = plt.subplots(figsize=(10, 6))
for name, group in df.groupby('group'):
ax.plot(group.x, group.y, marker='o', linestyle='', ms=6, label=name)
ax.legend()
ax.set_title('Grouped Scatter Plot - how2matplotlib.com')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
plt.show()
print("Grouped scatter plot has been displayed.")
这个例子使用Pandas的groupby
函数来按组绘制散点图。每个组使用不同的颜色,使得不同类别的数据点易于区分。
通过以上20个详细的示例,我们全面探讨了Matplotlib散点图的各种高级技巧和应用。从基础的散点图到复杂的动画和自定义图形,这些例子涵盖了数据可视化中常见的多种需求。通过灵活运用这些技巧,我们可以创建出既信息丰富又视觉吸引的数据可视化图表,有效地传达复杂的数据关系和模式。
在实际应用中,选择合适的散点图类型和定制选项取决于具体的数据特征和分析目标。例如,当处理大量数据点时,使用透明度和颜色映射可以帮助识别数据密度;当比较多个数据集时,子图和分组散点图会很有用;而对于需要展示多维关系的数据,3D散点图或气泡图可能是更好的选择。
此外,结合其他类型的图表(如直方图或密度图)可以提供更全面的数据视图。动画散点图则特别适合展示随时间变化的数据趋势。在进行回归分析或其他统计建模时,添加拟合线和置信区间可以直观地展示模型的性能和预测能力。
最后,值得注意的是,虽然Matplotlib提供了丰富的自定义选项,但在创建可视化时,保持简洁和清晰仍然是关键。过度复杂的图表可能会掩盖数据中的重要信息。因此,在应用这些技巧时,应始终考虑受众和传达信息的目的,选择最适合的可视化方法。
21. 散点图与轮廓线
在某些情况下,我们可能想要在散点图上添加轮廓线来显示数据的密度分布。这可以通过结合散点图和等高线图来实现。
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
np.random.seed(42)
x = np.random.normal(0, 1, 1000)
y = x + np.random.normal(0, 1, 1000)
# 计算点密度
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
fig, ax = plt.subplots(figsize=(10, 8))
scatter = ax.scatter(x, y, c=z, s=50, alpha=0.5, cmap='viridis')
plt.colorbar(scatter, label='Density')
# 添加轮廓线
kx, ky = np.mgrid[x.min():x.max():100j, y.min():y.max():100j]
k_positions = np.vstack([kx.ravel(), ky.ravel()])
k_z = gaussian_kde(xy)(k_positions)
ax.contour(kx, ky, k_z.reshape(kx.shape), colors='k', alpha=0.3)
ax.set_title('Scatter Plot with Contour Lines - how2matplotlib.com')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
plt.show()
print("Scatter plot with contour lines has been displayed.")
这个例子首先创建了一个基于点密度着色的散点图,然后使用contour
函数添加了轮廓线。这种可视化方法可以同时展示个别数据点和整体分布趋势。
22. 散点图与边缘分布
我们可以在散点图的边缘添加分布图,以更全面地展示数据的分布情况。
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
np.random.seed(42)
x = np.random.normal(0, 1, 1000)
y = x + np.random.normal(0, 1, 1000)
fig = plt.figure(figsize=(10, 10))
gs = fig.add_gridspec(3, 3)
ax_main = fig.add_subplot(gs[1:, :-1])
ax_right = fig.add_subplot(gs[1:, -1], sharey=ax_main)
ax_top = fig.add_subplot(gs[0, :-1], sharex=ax_main)
# 主散点图
ax_main.scatter(x, y, alpha=0.5)
ax_main.set_xlabel('X-axis')
ax_main.set_ylabel('Y-axis')
# 右侧分布图
sns.kdeplot(y=y, ax=ax_right, vertical=True)
ax_right.set_yticks([])
# 顶部分布图
sns.kdeplot(x=x, ax=ax_top)
ax_top.set_xticks([])
plt.suptitle('Scatter Plot with Marginal Distributions - how2matplotlib.com', y=0.95)
plt.tight_layout()
plt.show()
print("Scatter plot with marginal distributions has been displayed.")
这个例子使用了Matplotlib的子图功能和Seaborn库来创建带有边缘分布的散点图。主图显示散点图,而顶部和右侧的子图显示x和y的核密度估计分布。
23. 散点图与聚类
当我们有大量数据点时,可以使用聚类算法来识别数据中的模式,并在散点图上可视化这些聚类。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
np.random.seed(42)
x = np.concatenate([np.random.normal(0, 1, 300), np.random.normal(4, 1, 300)])
y = np.concatenate([np.random.normal(0, 1, 300), np.random.normal(4, 1, 300)])
# 使用K-means聚类
kmeans = KMeans(n_clusters=2)
kmeans.fit(np.column_stack((x, y)))
labels = kmeans.labels_
plt.figure(figsize=(10, 8))
scatter = plt.scatter(x, y, c=labels, cmap='viridis')
plt.colorbar(scatter, label='Cluster')
# 绘制聚类中心
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.8, marker='*')
plt.title('Scatter Plot with K-means Clustering - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
print("Scatter plot with K-means clustering has been displayed.")
这个例子使用了scikit-learn库的K-means聚类算法来对数据点进行聚类,然后在散点图上用不同的颜色表示不同的聚类。聚类中心用红色星号标记。
24. 散点图与箭头
有时我们需要在散点图上添加箭头来表示方向或趋势。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(20)
y = np.random.rand(20)
dx = np.random.randn(20) * 0.1
dy = np.random.randn(20) * 0.1
plt.figure(figsize=(10, 8))
plt.scatter(x, y, s=50)
plt.quiver(x, y, dx, dy, angles='xy', scale_units='xy', scale=1, color='red')
plt.title('Scatter Plot with Arrows - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.show()
print("Scatter plot with arrows has been displayed.")
这个例子使用plt.quiver()
函数在散点图上添加了箭头。箭头的起点是散点的位置,方向和长度由dx和dy决定。这种可视化方法可以用来表示向量场或数据点的移动趋势。
25. 散点图与不确定性椭圆
当数据点具有不确定性时,我们可以使用椭圆来表示这种不确定性。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Ellipse
np.random.seed(42)
x = np.random.rand(20)
y = np.random.rand(20)
xerr = np.random.rand(20) * 0.1
yerr = np.random.rand(20) * 0.1
fig, ax = plt.subplots(figsize=(10, 8))
ax.scatter(x, y, s=50)
for i in range(len(x)):
ellipse = Ellipse((x[i], y[i]), width=xerr[i]*2, height=yerr[i]*2,
angle=0, alpha=0.2, facecolor='none', edgecolor='red')
ax.add_patch(ellipse)
ax.set_title('Scatter Plot with Uncertainty Ellipses - how2matplotlib.com')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
plt.show()
print("Scatter plot with uncertainty ellipses has been displayed.")
这个例子为每个数据点添加了一个椭圆,椭圆的大小表示x和y方向的不确定性。这种方法可以直观地展示每个数据点的精确度。
通过这些额外的例子,我们进一步扩展了Matplotlib散点图的应用范围。从添加轮廓线和边缘分布,到展示聚类结果,再到表示方向和不确定性,这些技巧都能帮助我们创建更加丰富和信息量大的数据可视化。
在实际应用中,选择合适的可视化方法取决于数据的性质和我们想要传达的信息。例如:
- 当我们想要展示数据的整体分布和局部密度时,带轮廓线的散点图会很有用。
- 如果我们关心单个变量的分布以及它们之间的关系,带边缘分布的散点图是一个很好的选择。
- 在探索性数据分析中,聚类可以帮助我们发现数据中的模式和群组。
- 当数据点代表向量或有方向性时,带箭头的散点图可以有效地展示这种信息。
- 对于具有测量误差或其他形式不确定性的数据,使用不确定性椭圆可以更准确地表示数据的可靠性。
最后,值得注意的是,虽然这些高级技巧可以创建出非常复杂和信息丰富的图表,但在实际应用中,我们应该始终保持图表的清晰度和可读性。过于复杂的图表可能会让观众感到困惑,反而无法有效传达信息。因此,在应用这些技巧时,应该根据目标受众和具体需求来选择最合适的可视化方法。
总的来说,Matplotlib提供了极其灵活和强大的工具来创建各种类型的散点图。通过掌握这些技巧,我们可以更好地探索和展示数据,从而得出更深入的洞察和结论。无论是在科学研究、数据分析还是商业报告中,这些高级散点图技巧都能帮助我们更有效地讲述数据背后的故事。