如何在Matplotlib中创建含线条与不同填充样式标记的图例?
在Matplotlib中实现线条+无填充标记的组合显示及正确图例
要实现图中线条与无填充标记的组合效果,同时让图例正确显示两者的组合,可以通过以下方式实现:
核心参数说明
要制作无填充标记,只需在设置标记时添加以下参数之一:
markerfacecolor='none':指定标记内部无填充,仅保留边框fillstyle='none':另一种实现无填充标记的等效方式
方法1:直接绘图并自动生成图例
这种方式最简洁,绘制时同时指定线条和标记属性,图例会自动同步显示线条+无填充标记的组合:
import matplotlib.pyplot as plt import numpy as np # 生成示例数据 x = np.linspace(0, 10, 15) y_fit = 2 * x + 1 # 最佳拟合线数据 y_data = y_fit + np.random.randn(15) * 2 # 带噪声的原始数据 fig, ax = plt.subplots() # 绘制最佳拟合线:实线 + 无填充圆形标记 ax.plot(x, y_fit, color='darkred', linestyle='-', marker='o', markerfacecolor='none', markersize=8, label='最佳拟合线') # 绘制原始数据:无线条 + 无填充方形标记 ax.plot(x, y_data, color='steelblue', linestyle='', marker='s', markerfacecolor='none', markersize=8, label='原始数据') # 添加图例 ax.legend() plt.show()
方法2:自定义图例条目(灵活控制样式)
如果需要单独定义图例的样式(比如绘图样式和图例样式不一致时),可以用mlines.Line2D创建自定义图例项,同样设置无填充标记参数:
import matplotlib.pyplot as plt import matplotlib.lines as mlines import numpy as np x = np.linspace(0, 10, 15) y_fit = 2 * x + 1 fig, ax = plt.subplots() # 绘制带无填充标记的拟合线 ax.plot(x, y_fit, color='darkred', linestyle='-', marker='o', markerfacecolor='none', markersize=8) # 自定义图例条目,同时包含线条和无填充标记 fit_legend = mlines.Line2D([], [], color='darkred', linestyle='-', marker='o', markerfacecolor='none', markersize=8, label='最佳拟合线') ax.legend(handles=[fit_legend]) plt.show()
额外技巧
如果需要单独设置标记边框的颜色,可以添加markeredgecolor参数,例如:
ax.plot(x, y_fit, color='red', linestyle='-', marker='o', markerfacecolor='none', markeredgecolor='blue', markersize=8)
内容的提问来源于stack exchange,提问作者Idieh
相关产品推荐
相关产品推荐

