Matplotlib中如何在图形上添加标记点:全面指南
参考:How to Add Markers to a Graph Plot in Matplotlib
Matplotlib是Python中最流行的数据可视化库之一,它提供了丰富的绘图功能,其中包括在图形上添加标记点的能力。标记点可以帮助我们突出显示数据中的特定点,使图表更加清晰和信息丰富。本文将详细介绍如何在Matplotlib中的图形上添加各种类型的标记点,包括不同的标记样式、颜色、大小以及自定义标记等高级技巧。
1. 基本标记点的添加
在Matplotlib中,我们可以使用plot()
函数来绘制线图,并通过其参数来添加标记点。最简单的方法是在plot()
函数中使用marker
参数。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y = np.sin(x)
plt.figure(figsize=(8, 6))
plt.plot(x, y, marker='o', label='how2matplotlib.com')
plt.title('Basic Markers Example')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
在这个例子中,我们使用marker='o'
来添加圆形标记点。Matplotlib提供了多种预定义的标记样式,如’o’(圆形)、’s’(方形)、’^’(三角形)等。
2. 自定义标记样式
除了使用预定义的标记样式,我们还可以自定义标记的外观。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y = np.cos(x)
plt.figure(figsize=(8, 6))
plt.plot(x, y, marker='D', markersize=10, markeredgecolor='red', markerfacecolor='yellow', label='how2matplotlib.com')
plt.title('Custom Marker Style')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
在这个例子中,我们使用了以下参数来自定义标记点:
– marker='D'
:使用菱形标记
– markersize=10
:设置标记大小
– markeredgecolor='red'
:设置标记边缘颜色
– markerfacecolor='yellow'
:设置标记填充颜色
3. 只显示标记点而不显示线
有时我们可能只想显示标记点而不显示连接线。这可以通过设置线的样式为’None’来实现。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 20)
y = np.sin(x) * np.exp(-0.1 * x)
plt.figure(figsize=(8, 6))
plt.plot(x, y, 'o', linestyle='None', label='how2matplotlib.com')
plt.title('Markers Without Line')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
在这个例子中,linestyle='None'
确保只显示标记点而不绘制线。
4. 使用不同的标记点样式
在同一图表中使用不同的标记样式可以帮助区分多个数据系列。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y1 = np.sin(x)
y2 = np.cos(x)
plt.figure(figsize=(8, 6))
plt.plot(x, y1, 'o-', label='Sin - how2matplotlib.com')
plt.plot(x, y2, 's--', label='Cos - how2matplotlib.com')
plt.title('Different Marker Styles')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
这个例子展示了如何在同一图表中使用不同的标记样式和线型。’o-‘表示圆形标记和实线,’s–‘表示方形标记和虚线。
5. 使用scatter()函数添加标记点
除了plot()
函数,scatter()
函数也是添加标记点的常用方法,特别是当我们想要更灵活地控制每个点的属性时。
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=(8, 6))
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, label='how2matplotlib.com')
plt.title('Scatter Plot with Varying Colors and Sizes')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.colorbar()
plt.show()
Output:
在这个例子中,我们使用scatter()
函数创建了一个散点图,其中:
– c=colors
:根据colors
数组设置每个点的颜色
– s=sizes
:根据sizes
数组设置每个点的大小
– alpha=0.5
:设置点的透明度
6. 添加文本标记
有时,我们可能想在图表上的特定点添加文本标记。这可以使用annotate()
函数来实现。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='how2matplotlib.com')
plt.plot(np.pi, 0, 'ro') # 在 (π, 0) 处添加红点
plt.annotate('(π, 0)', xy=(np.pi, 0), xytext=(np.pi+0.5, 0.3),
arrowprops=dict(facecolor='black', shrink=0.05))
plt.title('Sine Wave with Annotation')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
这个例子展示了如何在正弦波图上的特定点(π, 0)添加文本标记。annotate()
函数不仅添加了文本,还添加了一个指向该点的箭头。
7. 使用自定义标记
Matplotlib允许我们使用自定义的标记符号。这可以通过定义一个标记路径来实现。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path
import matplotlib.patches as patches
# 定义一个五角星标记
verts = [
(0., 0.5), # 左上
(0.5, 0.5), # 右上
(0.25, 0.), # 下
(0., 0.25), # 左中
(0.5, 0.25),# 右中
(0., 0.5), # 回到起点
]
codes = [Path.MOVETO,
Path.LINETO,
Path.LINETO,
Path.LINETO,
Path.LINETO,
Path.CLOSEPOLY,
]
path = Path(verts, codes)
x = np.linspace(0, 10, 10)
y = np.sin(x)
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y, '-')
ax.plot(x, y, marker=path, markersize=15, linewidth=0, color='red', label='how2matplotlib.com')
ax.set_title('Custom Star Marker')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.legend()
ax.grid(True)
plt.show()
Output:
这个例子展示了如何创建一个自定义的五角星标记并将其应用到图表中。
8. 使用图像作为标记
我们甚至可以使用图像作为标记点。这在某些特殊的可视化需求中非常有用。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
def getImage(path, zoom=1):
return OffsetImage(plt.imread(path), zoom=zoom)
x = np.linspace(0, 10, 10)
y = np.sin(x)
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y)
# 假设我们有一个名为'marker.png'的图像文件
path = 'marker.png'
for x0, y0 in zip(x, y):
ab = AnnotationBbox(getImage(path, 0.1), (x0, y0), frameon=False)
ax.add_artist(ab)
ax.set_title('Image Markers - how2matplotlib.com')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
plt.show()
这个例子展示了如何使用图像文件作为标记点。注意,你需要准备一个名为’marker.png’的图像文件才能运行这个例子。
9. 标记点的动态大小
我们可以根据数据的某些属性动态调整标记点的大小。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 50)
y = np.sin(x)
sizes = np.abs(y) * 200 # 使用y值的绝对值来决定标记大小
plt.figure(figsize=(10, 6))
plt.scatter(x, y, s=sizes, alpha=0.5, label='how2matplotlib.com')
plt.title('Dynamic Marker Sizes')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
在这个例子中,标记点的大小随y值的绝对值变化。这种技术可以用来在散点图中表示第三个维度的数据。
10. 使用不同形状的标记
Matplotlib提供了多种预定义的标记形状。我们可以在同一图表中使用不同的形状来区分不同的数据系列。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y1, 'o-', label='Sin - how2matplotlib.com')
plt.plot(x, y2, 's--', label='Cos - how2matplotlib.com')
plt.plot(x, y3, '^:', label='Tan - how2matplotlib.com')
plt.title('Different Marker Shapes')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.ylim(-2, 2) # 限制y轴范围以便更好地显示
plt.show()
Output:
这个例子展示了如何使用圆形(‘o’)、方形(‘s’)和三角形(‘^’)标记来区分不同的三角函数曲线。
11. 使用填充标记
我们可以创建填充的标记点,这在某些情况下可以增强可读性。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y = np.exp(-0.1*x) * np.sin(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y, 'D', markersize=12, markerfacecolor='yellow', markeredgecolor='red', markeredgewidth=2, linestyle='None', label='how2matplotlib.com')
plt.title('Filled Markers')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
在这个例子中,我们创建了黄色填充、红色边缘的菱形标记点。
12. 标记点的渐变色
我们可以使用颜色映射(colormap)来为标记点设置渐变色,这对于表示数据的第三个维度非常有用。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 50)
y = np.sin(x)
colors = plt.cm.viridis(np.linspace(0, 1, len(x)))
plt.figure(figsize=(10, 6))
for i in range(len(x)):
plt.plot(x[i], y[i], 'o', color=colors[i], markersize=10)
plt.colorbar(plt.cm.ScalarMappable(cmap="viridis"), label="Color Scale")
plt.title('Gradient Colored Markers - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.grid(True)
plt.show()
这个例子展示了如何使用viridis颜色映射来为标记点设置渐变色。颜色从蓝色渐变到黄色,反映了x轴的变化。
13. 使用标记点突出显示异常值
标记点可以用来突出显示数据集中的异常值或特殊点。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 1, 100)
# 添加一些异常值
outliers_x = [2, 5, 8]
outliers_y = [10, 0, 15]
plt.figure(figsize=(10, 6))
plt.scatter(x, y, color='blue', alpha=0.5, label='Normal data')
plt.scatter(outliers_x, outliers_y, color='red', s=100, label='Outliers')
plt.title('Highlighting Outliers -how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
在这个例子中,我们使用蓝色小点表示正常数据,而用大的红色点突出显示异常值。这种方法可以帮助快速识别数据集中的异常点。
14. 使用标记点表示数据密度
在处理大量数据点时,我们可以使用标记点的大小或颜色来表示数据密度。
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 = np.random.normal(0, 1, 1000)
# 计算点密度
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
plt.figure(figsize=(10, 8))
plt.scatter(x, y, c=z, s=50, alpha=0.5, cmap='viridis')
plt.colorbar(label='Density')
plt.title('Density Plot using Markers - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个例子使用了高斯核密度估计来计算每个点的密度,然后用颜色来表示这个密度。这种方法可以有效地可视化大量数据点的分布情况。
15. 在3D图中添加标记点
Matplotlib也支持在3D图中添加标记点,这可以帮助我们更好地理解三维数据。
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 生成数据
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)
scatter = ax.scatter(x, y, z, c=colors, s=sizes, alpha=0.5)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
ax.set_title('3D Scatter Plot with Markers - how2matplotlib.com')
plt.colorbar(scatter)
plt.show()
Output:
这个例子展示了如何在3D空间中创建散点图,并使用颜色和大小来表示额外的数据维度。
16. 使用标记点创建气泡图
气泡图是散点图的一种变体,其中点的大小表示第三个数据维度。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.rand(20)
y = np.random.rand(20)
sizes = np.random.rand(20) * 1000
plt.figure(figsize=(10, 8))
plt.scatter(x, y, s=sizes, alpha=0.5)
plt.title('Bubble Chart - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 添加一个图例来解释气泡大小
for area in [100, 300, 500]:
plt.scatter([], [], c='gray', alpha=0.3, s=area,
label=str(area) + ' units')
plt.legend(scatterpoints=1, frameon=False, labelspacing=1, title='Size')
plt.show()
Output:
这个例子创建了一个简单的气泡图,其中每个气泡的大小代表了一个额外的数据维度。这种图表在比较多个变量时非常有用。
17. 使用标记点创建星图
星图(也称为雷达图)是一种用于显示多变量数据的图表类型,其中每个变量由从中心点出发的一条轴表示。
import matplotlib.pyplot as plt
import numpy as np
# 数据
categories = ['Speed', 'Power', 'Accuracy', 'Range', 'Durability']
values = [4, 4, 5, 3, 2]
# 计算角度
N = len(categories)
angles = [n / float(N) * 2 * np.pi for n in range(N)]
values += values[:1]
angles += angles[:1]
# 绘图
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(projection='polar'))
ax.plot(angles, values, 'o-', linewidth=2)
ax.fill(angles, values, alpha=0.25)
# 设置角度标签
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
ax.set_title('Star Plot - how2matplotlib.com')
plt.show()
Output:
这个例子创建了一个简单的星图,展示了某个对象在五个不同类别上的评分。标记点用于突出显示每个类别的具体数值。
18. 使用标记点创建甘特图
甘特图是一种用于显示项目进度的条形图。我们可以使用标记点来突出显示重要的里程碑或事件。
import matplotlib.pyplot as plt
import numpy as np
# 项目数据
projects = ['Project A', 'Project B', 'Project C', 'Project D']
start_dates = np.array([1, 5, 8, 12])
durations = np.array([10, 8, 6, 8])
# 创建甘特图
fig, ax = plt.subplots(figsize=(12, 6))
# 绘制水平条形图
ax.barh(projects, durations, left=start_dates, height=0.5)
# 添加里程碑标记
milestones = [(3, 0), (7, 1), (14, 2), (18, 3)]
for date, proj in milestones:
ax.plot(date, proj, 'ro', markersize=10)
ax.set_xlabel('Time')
ax.set_ylabel('Projects')
ax.set_title('Gantt Chart with Milestones - how2matplotlib.com')
ax.grid(True)
plt.tight_layout()
plt.show()
Output:
在这个例子中,我们创建了一个简单的甘特图,并使用红色圆点标记来表示每个项目的重要里程碑。
19. 使用标记点创建股票K线图
在金融数据可视化中,K线图是一种常用的图表类型。我们可以使用标记点来突出显示开盘价和收盘价。
import matplotlib.pyplot as plt
import numpy as np
# 模拟股票数据
np.random.seed(42)
dates = np.arange(20)
opens = np.random.randn(20).cumsum() + 100
closes = opens + np.random.randn(20)
highs = np.maximum(opens, closes) + np.random.rand(20)
lows = np.minimum(opens, closes) - np.random.rand(20)
fig, ax = plt.subplots(figsize=(12, 6))
# 绘制K线
ax.vlines(dates, lows, highs, color='black', linewidth=1)
ax.vlines(dates, opens, closes, color='black', linewidth=4)
# 使用标记点表示开盘价和收盘价
ax.plot(dates, opens, 'go', markersize=8, label='Open')
ax.plot(dates, closes, 'ro', markersize=8, label='Close')
ax.set_xlabel('Date')
ax.set_ylabel('Price')
ax.set_title('Stock Candlestick Chart - how2matplotlib.com')
ax.legend()
plt.tight_layout()
plt.show()
Output:
在这个例子中,我们使用绿色圆点表示开盘价,红色圆点表示收盘价,黑色线条表示当天的价格范围。
20. 使用标记点创建地图散点图
最后,让我们看一个将标记点用于地理数据可视化的例子。我们将在世界地图上标记一些城市的位置。
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
# 创建地图
plt.figure(figsize=(15, 10))
m = Basemap(projection='mill', llcrnrlat=-60, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c')
# 绘制海岸线和国界
m.drawcoastlines()
m.drawcountries()
# 城市数据
cities = ['New York', 'London', 'Tokyo', 'Sydney', 'Rio de Janeiro']
lats = [40.7128, 51.5074, 35.6895, -33.8688, -22.9068]
lons = [-74.0060, -0.1278, 139.6917, 151.2093, -43.1729]
# 在地图上标记城市
for city, lat, lon in zip(cities, lats, lons):
x, y = m(lon, lat)
m.plot(x, y, 'ro', markersize=10)
plt.text(x, y, city, fontsize=12, ha='right', va='bottom')
plt.title('World Map with City Markers - how2matplotlib.com')
plt.show()
Output:
这个例子展示了如何使用Matplotlib和Basemap库在世界地图上标记城市位置。每个城市都用一个红色圆点表示,并附有城市名称标签。
总结起来,Matplotlib提供了丰富的工具和选项来在图形上添加标记点。通过合理使用这些标记点,我们可以大大提高数据可视化的效果,使图表更加清晰、信息更加丰富。无论是简单的散点图,还是复杂的多维数据可视化,标记点都是一个强大的工具,可以帮助我们更好地展示和理解数据。