首页 > 解决方案 > matplotlib python,如何设置不同颜色和名称的不同块

问题描述

import numpy as np
from matplotlib import pyplot as plt
data = {'Mon':(0,0.5), 'Tue': (0.7,1), 'Wen': (0.1,0.3), 'Th': (0.3,0.4)
       ,'Fri':(0.1,0.2),'Sat':(0.1,0.4),'Sun':(0,0)
       }
width = 0.5 
fig, ax = plt.subplots()
for i, values in enumerate(data.values()):
    ymin, ymax = values
    ax.axvspan(xmin=i-width/2, xmax=i+width/2, ymin=ymin,ymax=ymax)

ax.grid(True)

#add ticks
ax.set_xticks(np.arange(0,len(data)))
ax.set_xticklabels(data.keys())
ax.set_yticks(np.arange(0,37))
time_list = [
       '6:00','6:30','7:00','7:30',
       '8:00','8:30','9:00','9:30',
       '10:00','10:30','11:00','11:30',
       '12:00','12:30','13:00','13:30',
       '14:00','14:30','15:00','15:30',
       '16:00','16:30','17:00','17:30',
       '18:00','18:30','19:00','19:30',
       '20:00','20:30','21:00','21:30',
       '22:00','22:30','23:00','23:30',
       '24:00',
       ]
ax.set_yticklabels(x for x in time_list)
plt.show()

电流输出 img

你好 !谁能告诉我如何在 pyplot 中设置具有不同颜色和名称的不同块?

例如: Block 1 : Mon 6:00-15:00 (color red , name: Accounting 1), Block 2: Tue 18:30-24:00 ( color 黄色 , name: Spanish 2)

我已经通过使用“plt.bar”函数和文档中的许多其他方法尝试了几种方法,但它们没有工作,我可能做错了什么,有人可以帮忙吗?

上面是代码,我也包括了当前的输出 img。

标签: pythonmatplotlib

解决方案


您可以将颜色参数传递给ax.axvspan()并用于ax.text()设置任意标签。我只会显示我进行更改的那部分代码。

编辑:默认情况下采用的位置坐标ax.text()是数据坐标。因此,我们可以对用于绘制矩形的 x 坐标使用相同的值。对于 y 坐标,我们必须将值从 [0, 1] 区间转换为数据网格。由于我们有 (24 - 6) * 2 = 36 条网格线,这就是转换因子。给予或采取一些补偿。为了使标签保持在网格内,我们可以区分大小写,如果矩形上方没有空间,则将标签绘制在矩形下方。

colors = ['red', 'yellow', 'gray', 'gray', 'gray', 'gray', 'gray']
labels = ['Accounting 1', 'Spanish 2', 'Label 3', 'Label 4', 'Label 5', 'Label 6', '']

fig, ax = plt.subplots(figsize=[15, 12])

for i, values in enumerate(data.values()):
    ymin, ymax = values
    ax.axvspan(xmin=i-width/2, xmax=i+width/2, ymin=ymin, ymax=ymax, 
               color=colors[i])
    if ymax < 35/36:
        label_y = 36 * ymax + 0.25
    else:
        label_y = 36 * ymin - 1
    ax.text(i-width/2, label_y, labels[i], fontsize=16)

颜色和标签演示


推荐阅读