matplotlib 如何将两个传奇叠加在一起?

csbfibhn  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(144)

我使用matplotlib绘制了以下图表:

使用的代码如下所示:

import matplotlib.pyplot as plt
import numpy as np

# Generate data
x = np.linspace(0, 10, 10, dtype=float)
x_mid = x[:-1] + np.diff(x) / 2.0
y = np.random.rand(len(x) - 1) * 100
yerr = np.random.rand(len(x) - 1) * 20
# Plot
fig = plt.figure()
ax = fig.add_subplot()
ax.errorbar(x_mid, y=y, yerr=yerr, color='blue', fmt='o', markersize=10, label='Data')
ax.stairs(y, x, baseline=None, color='blue', linewidth=2, linestyle='solid', label='Data')

ax.legend()

plt.show()

我在生成图例时遇到了困难。虽然我可以使用Line2D([0], [0], marker='|', ls='-', c='blue', markersize=16, markeredgewidth=16)生成十字线,但它中间没有点。
我无法生成一个中间有一个点的十字线,如何才能达到我的目的呢?在Line2D生成的十字线中间叠加一个点是可行的,但是如何操作呢?

ddrv8njm

ddrv8njm1#

在最新的matplotlib版本中,如果将图例句柄组合成一个元组,它们将被绘制在彼此的顶部。
对于元组,matplotlib自动使用HandlerTupple作为图例处理器,并使用默认参数。legend guide包含了一些不同选项的示例。

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import numpy as np

# Generate data
x = np.linspace(0, 10, 10, dtype=float)
x_mid = x[:-1] + np.diff(x) / 2.0
y = np.random.rand(len(x) - 1) * 100
yerr = np.random.rand(len(x) - 1) * 20
# Plot
fig, ax = plt.subplots()
bars = ax.errorbar(x_mid, y=y, yerr=yerr, color='blue', fmt='o', markersize=10, label='Data')
stairs = ax.stairs(y, x, baseline=None, color='blue', linewidth=2, linestyle='solid', label='Data')

vertical_handle = Line2D([0], [0], marker='|', ls='', 
                         c=bars[0].get_color(), markersize=22, markeredgewidth=bars[0].get_markeredgewidth())
ax.legend(handles=[(bars, stairs, vertical_handle)], labels=['combined'])
plt.show()

相关问题