Matplotlib 的内置区间图

use*_*793 4 python plot matplotlib

我正在尝试为多个条目绘制多个间隔。

我尝试使用循环来枚举条目,一次绘制一个间隔。

import matplotlib.pyplot as plt

intervals = [(1, 2), (1.1, 2.5), (1.2, 4), (1.5, 10), (1.7, 12)]

num_intervals = len(intervals)
viridis = plt.cm.get_cmap('viridis', num_intervals)

fig, ax = plt.subplots()
for idx, (min_int, max_int) in enumerate(intervals):
  ax.hlines(y=idx, xmin=min_int, xmax=max_int, colors=viridis(idx / num_intervals), label=idx)
ax.legend()
plt.yticks([], [])
plt.show()
Run Code Online (Sandbox Code Playgroud)

阴谋

我希望使用 matplotlib 的内置方法一次性绘制多个间隔。另外,我希望绘制图像中每个间隔的最小值和最大值。

我希望向行中添加最小值和最大值注释,如下所示: 最小值和最大值注释

She*_*ore 6

您可以调整您的代码,以便能够使用LineCollection答案中概述的想法。此外,您可以使用此方法将图例添加到 LineCollection 。

我修改了第一个答案,以lines使用列表理解以所需的格式创建输入数据。

from matplotlib.lines import Line2D # Imported for legends

num_intervals = len(intervals)
viridis = plt.cm.get_cmap('viridis', num_intervals)
colors = np.array([viridis(idx / num_intervals) for idx in range(len(intervals))])

# Prepare the input data in correct format for LineCollection 
lines = [[(i[0], j), (i[1], j)] for i, j in zip(intervals, range(len(intervals)))]

lc = mc.LineCollection(lines, colors= colors, linewidths=2)
fig, ax = pl.subplots()
ax.add_collection(lc)
ax.margins(0.1)
plt.yticks([], [])

# Adding the legends
def make_proxy(col, scalar_mappable, **kwargs):
    color = col 
    return Line2D([0, 1], [0, 1], color=color, **kwargs)
proxies = [make_proxy(c, lc, linewidth=2) for c in colors]
ax.legend(proxies, range(5))

# Adding annotations
for i, x in enumerate(intervals):
    plt.text(x[0], i+0.1, x[0], color=colors[i])
    plt.text(x[1], i+0.1, x[1], color=colors[i])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述