Matplotlib散点图标记样式全面指南:如何绘制独特的数据点
参考:matplotlib scatter marker styles
Matplotlib是Python中最流行的数据可视化库之一,它提供了丰富的绘图功能,其中散点图(scatter plot)是一种常用的图表类型。在绘制散点图时,标记(marker)的样式对于数据的可视化效果至关重要。本文将全面介绍Matplotlib中散点图的标记样式,包括如何选择、自定义和应用不同的标记样式,以及如何通过标记样式来增强数据的可读性和美观性。
1. Matplotlib散点图基础
在深入探讨标记样式之前,让我们先回顾一下Matplotlib中绘制散点图的基本方法。散点图通常用于展示两个变量之间的关系,每个数据点在图上表示为一个标记。
以下是一个简单的散点图示例:
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(50)
y = np.random.rand(50)
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
plt.title('Basic Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子创建了一个基本的散点图,使用默认的圆形标记。但Matplotlib提供了多种标记样式,让我们能够根据需要自定义散点图的外观。
2. 内置标记样式
Matplotlib提供了多种内置的标记样式,可以通过marker
参数来指定。以下是一些常用的内置标记样式:
- ‘o’: 圆形
- ‘s’: 正方形
- ‘^’: 上三角形
- ‘v’: 下三角形
- ‘D’: 菱形
- ‘*’: 星形
- ‘+’: 加号
- ‘x’: 叉号
让我们创建一个示例,展示这些常用的标记样式:
import matplotlib.pyplot as plt
import numpy as np
markers = ['o', 's', '^', 'v', 'D', '*', '+', 'x']
x = np.arange(len(markers))
y = np.random.rand(len(markers))
plt.figure(figsize=(12, 6))
for i, marker in enumerate(markers):
plt.scatter(x[i], y[i], marker=marker, s=200, label=f'Marker: {marker}')
plt.title('Common Marker Styles in Matplotlib - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
在这个例子中,我们使用了一个循环来绘制不同的标记样式。s
参数用于设置标记的大小,label
参数用于为每个标记添加图例标签。
3. 自定义标记大小和颜色
除了选择不同的标记样式,我们还可以自定义标记的大小和颜色。这对于表示数据的额外维度非常有用。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50)
plt.figure(figsize=(10, 8))
scatter = plt.scatter(x, y, c=colors, s=sizes, alpha=0.6, cmap='viridis')
plt.colorbar(scatter)
plt.title('Scatter Plot with Custom Size and Color - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中:
– c
参数用于设置标记的颜色,可以是单一颜色或颜色数组。
– s
参数用于设置标记的大小,可以是单一值或大小数组。
– alpha
参数用于设置标记的透明度。
– cmap
参数指定了颜色映射。
4. 使用字符作为标记
Matplotlib还允许我们使用字符作为标记。这在某些情况下可能非常有用,例如当我们想用字母或数字来标识数据点时。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(5)
y = np.random.rand(5)
markers = ['A', 'B', 'C', 'D', 'E']
plt.figure(figsize=(8, 6))
for i, marker in enumerate(markers):
plt.scatter(x[i], y[i], marker=''+marker+'', s=500, label=f'Point {marker}')
plt.title('Scatter Plot with Character Markers - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.show()
Output:
在这个例子中,我们使用''+marker+''
的格式来指定字符标记。美元符号$
告诉Matplotlib将字符解释为数学文本。
5. 自定义标记形状
除了使用内置的标记样式和字符,Matplotlib还允许我们创建完全自定义的标记形状。这可以通过定义标记的顶点来实现。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(3)
y = np.random.rand(3)
custom_marker = [
(-0.5, -0.5), # 左下
(0.5, -0.5), # 右下
(0, 0.5), # 顶部
(-0.5, -0.5), # 回到起点,闭合路径
]
plt.figure(figsize=(8, 6))
plt.scatter(x, y, marker=custom_marker, s=500)
plt.title('Scatter Plot with Custom Marker Shape - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们定义了一个三角形标记。自定义标记是通过指定顶点坐标列表来创建的。
6. 结合多种标记样式
在某些情况下,我们可能需要在同一个散点图中使用多种标记样式。这可以用来区分不同类别的数据点。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x1 = np.random.rand(20)
y1 = np.random.rand(20)
x2 = np.random.rand(20)
y2 = np.random.rand(20)
x3 = np.random.rand(20)
y3 = np.random.rand(20)
plt.figure(figsize=(10, 8))
plt.scatter(x1, y1, marker='o', s=100, label='Group A')
plt.scatter(x2, y2, marker='^', s=100, label='Group B')
plt.scatter(x3, y3, marker='s', s=100, label='Group C')
plt.title('Scatter Plot with Multiple Marker Styles - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.show()
Output:
这个例子展示了如何在同一个图中使用不同的标记样式来表示不同的数据组。
7. 标记边缘和填充颜色
Matplotlib允许我们分别设置标记的边缘颜色和填充颜色。这可以用来创建更复杂的视觉效果。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(4)
y = np.random.rand(4)
plt.figure(figsize=(8, 6))
plt.scatter(x, y, marker='o', s=500,
facecolors='none', edgecolors='purple', linewidth=2)
plt.title('Scatter Plot with Custom Edge and Fill Colors - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中:
– facecolors='none'
设置标记的填充颜色为透明。
– edgecolors='purple'
设置标记的边缘颜色为紫色。
– linewidth=2
设置边缘线的宽度。
8. 使用图像作为标记
Matplotlib甚至允许我们使用自定义图像作为标记。这在某些特殊场景下可能非常有用。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
def create_image_marker(path, zoom=0.1):
return OffsetImage(plt.imread(path), zoom=zoom)
x = np.random.rand(5)
y = np.random.rand(5)
fig, ax = plt.subplots(figsize=(10, 8))
image_path = 'path_to_your_image.png' # 替换为实际的图像路径
image_marker = create_image_marker(image_path)
for xi, yi in zip(x, y):
ab = AnnotationBbox(image_marker, (xi, yi), frameon=False)
ax.add_artist(ab)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_title('Scatter Plot with Image Markers - how2matplotlib.com')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
plt.show()
注意:这个例子需要一个实际的图像文件。你需要将'path_to_your_image.png'
替换为你系统中的实际图像路径。
9. 动态改变标记样式
在某些情况下,我们可能希望根据数据的特征动态地改变标记样式。这可以通过使用条件语句来实现。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)
values = np.random.randn(50)
plt.figure(figsize=(10, 8))
for xi, yi, val in zip(x, y, values):
if val < -1:
marker = 'v'
color = 'blue'
elif -1 <= val < 0:
marker = 'o'
color = 'green'
elif 0 <= val < 1:
marker = 's'
color = 'orange'
else:
marker = '^'
color = 'red'
plt.scatter(xi, yi, marker=marker, c=color, s=100)
plt.title('Scatter Plot with Dynamic Marker Styles - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.colorbar(label='Value')
plt.show()
Output:
这个例子根据values
数组中的值动态选择标记样式和颜色。
10. 使用标记样式创建图例
标记样式不仅可以用于数据点,还可以用于创建自定义图例。这在需要解释复杂图表时特别有用。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.choice(['red', 'green', 'blue'], 50)
sizes = np.random.randint(50, 200, 50)
plt.figure(figsize=(12, 8))
for color in ['red', 'green', 'blue']:
mask = colors == color
plt.scatter(x[mask], y[mask], c=color, s=sizes[mask], alpha=0.6, label=color.capitalize())
# 自定义图例
legend_elements = [
plt.scatter([], [], c='red', s=100, label='Small'),
plt.scatter([], [], c='red', s=200, label='Medium'),
plt.scatter([], [], c='red', s=300, label='Large')
]
# 添加两个图例
plt.legend(title='Colors', loc='upper left')
plt.legend(handles=legend_elements, title='Sizes', loc='upper right')
plt.title('Scatter Plot with Custom Legends - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子展示了如何创建两个独立的图例:一个用于颜色,另一个用于大小。
11. 3D散点图中的标记样式
Matplotlib也支持3D散点图,我们同样可以在3D图中应用各种标记样式。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
n = 100
xs = np.random.rand(n)
ys = np.random.rand(n)
zs = np.random.rand(n)
colors = np.random.rand(n)
sizes = 1000 * np.random.rand(n)
scatter = ax.scatter(xs, ys, zs, c=colors, s=sizes, alpha=0.6, cmap='viridis', marker='o')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
ax.set_title('3D Scatter Plot with Custom Markers - how2matplotlib.com')
plt.colorbar(scatter)
plt.show()
Output:
这个例子创建了一个3D散点图,使用颜色和大小来表示额外的数据维度。
12. 动画散点图中的标记样式
我们还可以创建动画散点图,其中标记的样式或属性随时间变化。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
fig, ax = plt.subplots(figsize=(10, 8))
n = 50
x = np.random.rand(n)
y = np.random.rand(n)
colors = np.random.rand(n)
sizes = np.random.randint(50, 300, n)
scatter = ax.scatter(x, y, c=colors, s=sizes, cmap='viridis', alpha=0.6)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_title('Animated Scatter Plot - how2matplotlib.com')
def update(frame):
global x, y, colors, sizes
x += np.random.randn(n) * 0.01
y += np.random.randn(n) * 0.01
colors = np.random.rand(n)
sizes = np.random.randint(50, 300, n)
scatter.set_offsets(np.c_[x, y])
scatter.set_array(colors)
scatter.set_sizes(sizes)
return scatter,
ani = animation.FuncAnimation(fig, update, frames=200, interval=50, blit=True)
plt.show()
Output:
这个例子创建了一个动画散点图,其中数据点的位置、颜色和大小随时间变化。update
函数在每一帧更新数据点的属性。
13. 使用不同标记样式表示数据分类
当我们有分类数据时,使用不同的标记样式可以很好地区分不同类别。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 50
x = np.random.rand(n)
y = np.random.rand(n)
categories = np.random.choice(['A', 'B', 'C'], n)
markers = {'A': 'o', 'B': 's', 'C': '^'}
colors = {'A': 'red', 'B': 'green', 'C': 'blue'}
plt.figure(figsize=(10, 8))
for category in ['A', 'B', 'C']:
mask = categories == category
plt.scatter(x[mask], y[mask],
marker=markers[category],
c=colors[category],
s=100,
label=f'Category {category}')
plt.title('Scatter Plot with Categorical Data - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.show()
Output:
这个例子展示了如何使用不同的标记样式和颜色来表示不同的数据类别。
14. 组合多种标记属性
我们可以组合多种标记属性来创建更复杂的可视化效果。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 50
x = np.random.rand(n)
y = np.random.rand(n)
sizes = np.random.randint(50, 500, n)
colors = np.random.rand(n)
shapes = np.random.choice(['o', 's', '^', 'D'], n)
plt.figure(figsize=(12, 10))
for shape in ['o', 's', '^', 'D']:
mask = shapes == shape
plt.scatter(x[mask], y[mask],
marker=shape,
s=sizes[mask],
c=colors[mask],
alpha=0.6,
cmap='viridis')
plt.title('Complex Scatter Plot with Multiple Attributes - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.colorbar(label='Color Value')
plt.show()
Output:
这个例子结合了不同的标记形状、大小和颜色,创建了一个复杂的散点图。
15. 使用标记样式突出显示特定数据点
有时我们可能想要突出显示某些特定的数据点。这可以通过使用不同的标记样式或大小来实现。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 100
x = np.random.rand(n)
y = np.random.rand(n)
importance = np.random.rand(n)
plt.figure(figsize=(10, 8))
# 绘制普通数据点
plt.scatter(x, y, c='blue', alpha=0.6, label='Normal')
# 突出显示重要数据点
important_threshold = 0.8
important_mask = importance > important_threshold
plt.scatter(x[important_mask], y[important_mask],
c='red', s=200, marker='*', label='Important')
plt.title('Scatter Plot with Highlighted Points - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.show()
Output:
这个例子使用不同的颜色、大小和标记样式来突出显示重要的数据点。
16. 使用标记样式创建气泡图
气泡图是散点图的一种变体,其中数据点的大小表示第三个变量。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 50
x = np.random.rand(n)
y = np.random.rand(n)
sizes = np.random.randint(20, 1000, n)
colors = np.random.rand(n)
plt.figure(figsize=(12, 10))
scatter = plt.scatter(x, y, s=sizes, c=colors, alpha=0.6, cmap='viridis')
plt.title('Bubble Chart - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.colorbar(scatter, label='Color Value')
# 添加大小图例
size_legend = plt.legend(*scatter.legend_elements(num=4, prop="sizes", alpha=0.6),
loc="upper right", title="Sizes")
plt.gca().add_artist(size_legend)
plt.show()
Output:
这个例子创建了一个气泡图,其中点的大小和颜色都表示额外的数据维度。
17. 使用标记样式创建星图
星图是一种特殊类型的散点图,用于显示多维数据。
import matplotlib.pyplot as plt
import numpy as np
def star_plot(data, labels, marker='o'):
angles = np.linspace(0, 2*np.pi, len(labels), endpoint=False)
data = np.concatenate((data, [data[0]])) # 闭合图形
angles = np.concatenate((angles, [angles[0]])) # 闭合图形
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(projection='polar'))
ax.plot(angles, data)
ax.fill(angles, data, alpha=0.25)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(labels)
ax.set_ylim(0, 10)
for angle, radius in zip(angles, data):
ax.scatter(angle, radius, marker=marker, s=100, color='red')
plt.title('Star Plot - how2matplotlib.com')
plt.show()
# 示例数据
data = [8, 7, 6, 5, 4, 7]
labels = ['A', 'B', 'C', 'D', 'E', 'F']
star_plot(data, labels, marker='*')
Output:
这个例子创建了一个星图,使用星形标记来突出显示每个数据点。
18. 使用标记样式创建雷达图
雷达图是另一种多维数据可视化方法,类似于星图。
import matplotlib.pyplot as plt
import numpy as np
def radar_plot(data, labels, marker='o'):
angles = np.linspace(0, 2*np.pi, len(labels), endpoint=False)
data = np.concatenate((data, [data[0]])) # 闭合图形
angles = np.concatenate((angles, [angles[0]])) # 闭合图形
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(projection='polar'))
ax.plot(angles, data)
ax.fill(angles, data, alpha=0.25)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(labels)
for angle, radius in zip(angles, data):
ax.scatter(angle, radius, marker=marker, s=100, color='red')
plt.title('Radar Chart - how2matplotlib.com')
plt.show()
# 示例数据
data = [4, 3, 5, 2, 4, 5]
labels = ['Speed', 'Power', 'Agility', 'Intelligence', 'Strength', 'Endurance']
radar_plot(data, labels, marker='^')
Output:
这个例子创建了一个雷达图,使用三角形标记来突出显示每个数据点。
19. 使用标记样式创建极坐标散点图
极坐标系统提供了另一种有趣的数据可视化方式。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
r = np.random.rand(100)
theta = 2 * np.pi * np.random.rand(100)
fig, ax = plt.subplots(figsize=(10, 10), subplot_kw=dict(projection='polar'))
scatter = ax.scatter(theta, r, c=r, s=r*500, cmap='viridis', alpha=0.6)
plt.colorbar(scatter)
ax.set_title('Polar Scatter Plot - how2matplotlib.com')
plt.show()
Output:
这个例子创建了一个极坐标散点图,其中点的颜色和大小都随半径变化。
20. 使用标记样式创建等高线图
虽然等高线图通常不使用散点标记,但我们可以结合散点图和等高线图来创建有趣的可视化效果。
import matplotlib.pyplot as plt
import numpy as np
def f(x, y):
return np.sin(np.sqrt(x ** 2 + y ** 2))
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig, ax = plt.subplots(figsize=(10, 8))
contour = ax.contourf(X, Y, Z, cmap='viridis', levels=20)
plt.colorbar(contour)
# 添加散点
scatter_x = np.random.uniform(-6, 6, 50)
scatter_y = np.random.uniform(-6, 6, 50)
scatter_z = f(scatter_x, scatter_y)
scatter = ax.scatter(scatter_x, scatter_y, c=scatter_z, s=100, cmap='viridis',
edgecolors='white', linewidth=0.5, marker='o')
ax.set_title('Contour Plot with Scatter Points - how2matplotlib.com')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
plt.show()
Output:
这个例子结合了等高线图和散点图,使用圆形标记来显示特定点的值。
总结:
本文全面介绍了Matplotlib中散点图标记样式的各种应用和技巧。从基本的标记样式选择到复杂的自定义标记,从2D散点图到3D和动画散点图,我们探讨了多种使用标记样式增强数据可视化效果的方法。通过合理使用标记样式,我们可以使散点图更加信息丰富、直观易懂,从而更好地传达数据中的重要信息。在实际应用中,选择合适的标记样式不仅可以提高图表的美观度,还能帮助读者更快速、准确地理解数据。