如何在 matplotlib 中绘制范围条形图?
How to do a range bar graph in matplotlib?
我正在尝试使用类似于以下内容的 matplotlib 制作绘图:
但是,我不太确定要使用哪种类型的图表。我的数据具有以下形式,其中起始 x 位置是大于或等于 0 的正值:
<item 1><start x position><end x position>
<item 2><start x position><end x position>
查看文档,我看到有 barh and errorbar,但我不确定是否可以使用带有起始偏移量的 barh。鉴于我的数据类型,最好的使用方法是什么?我对图书馆不太熟悉,所以我希望能得到一些见识。
开胃菜
注释代码
据我所知,最直接的方法是使用 patches
模块直接在 matplotlib
canvas 上绘制矩形12=]
下面是一个简单的实现
import matplotlib.pyplot as plt
import matplotlib.patches as patches
def plot_rect(data, delta=0.4):
"""data is a dictionary, {"Label":(low,hi), ... }
return a drawing that you can manipulate, show, save etc"""
yspan = len(data)
yplaces = [.5+i for i in range(yspan)]
ylabels = sorted(data.keys())
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_yticks(yplaces)
ax.set_yticklabels(ylabels)
ax.set_ylim((0,yspan))
# later we'll need the min and max in the union of intervals
low, hi = data[ylabels[0]]
for pos, label in zip(yplaces,ylabels):
start, end = data[label]
ax.add_patch(patches.Rectangle((start,pos-delta/2.0),end-start,delta))
if start<low : low=start
if end>hi : hi=end
# little small trick, draw an invisible line so that the x axis
# limits are automatically adjusted...
ax.plot((low,hi),(0,0))
# now get the limits as automatically computed
xmin, xmax = ax.get_xlim()
# and use them to draw the hlines in your example
ax.hlines(range(1,yspan),xmin,xmax)
# the vlines are simply the x grid lines
ax.grid(axis='x')
# eventually return what we have done
return ax
# this is the main script, note that we have imported pyplot as plt
# the data, inspired by your example,
data = {'A':(1901,1921),
'B':(1917,1935),
'C':(1929,1948),
'D':(1943,1963),
'E':(1957,1983),
'F':(1975,1991),
'G':(1989,2007)}
# call the function and give its result a name
ax = plot_rect(data)
# so that we can further manipulate it using the `axes` methods, e.g.
ax.set_xlabel('Whatever')
# finally save or show what we have
plt.show()
我们苦难的结果已经显示在这篇post...
的第一段
附录
假设你觉得蓝色是一种很沉闷的颜色...
您放置在绘图中的 patches
可以作为绘图的 属性(恰如其分地命名为 patches
...)访问并且也可以修改,例如,
ax = plot_rect(data)
ax.set_xlabel('Whatever')
for rect in ax.patches:
rect.set(facecolor=(0.9,0.9,0.2,1.0), # a tuple, RGBA
edgecolor=(0.6,0.2,0.3,1.0),
linewidth=3.0)
plt.show()
在我的 VH 看来,自定义绘图功能应该是描述情节最不可或缺的功能,因为这种 post 制作通常在 matplotlib
.[=20= 中非常容易]
我正在尝试使用类似于以下内容的 matplotlib 制作绘图:
但是,我不太确定要使用哪种类型的图表。我的数据具有以下形式,其中起始 x 位置是大于或等于 0 的正值:
<item 1><start x position><end x position>
<item 2><start x position><end x position>
查看文档,我看到有 barh and errorbar,但我不确定是否可以使用带有起始偏移量的 barh。鉴于我的数据类型,最好的使用方法是什么?我对图书馆不太熟悉,所以我希望能得到一些见识。
开胃菜
注释代码
据我所知,最直接的方法是使用 patches
模块直接在 matplotlib
canvas 上绘制矩形12=]
下面是一个简单的实现
import matplotlib.pyplot as plt
import matplotlib.patches as patches
def plot_rect(data, delta=0.4):
"""data is a dictionary, {"Label":(low,hi), ... }
return a drawing that you can manipulate, show, save etc"""
yspan = len(data)
yplaces = [.5+i for i in range(yspan)]
ylabels = sorted(data.keys())
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_yticks(yplaces)
ax.set_yticklabels(ylabels)
ax.set_ylim((0,yspan))
# later we'll need the min and max in the union of intervals
low, hi = data[ylabels[0]]
for pos, label in zip(yplaces,ylabels):
start, end = data[label]
ax.add_patch(patches.Rectangle((start,pos-delta/2.0),end-start,delta))
if start<low : low=start
if end>hi : hi=end
# little small trick, draw an invisible line so that the x axis
# limits are automatically adjusted...
ax.plot((low,hi),(0,0))
# now get the limits as automatically computed
xmin, xmax = ax.get_xlim()
# and use them to draw the hlines in your example
ax.hlines(range(1,yspan),xmin,xmax)
# the vlines are simply the x grid lines
ax.grid(axis='x')
# eventually return what we have done
return ax
# this is the main script, note that we have imported pyplot as plt
# the data, inspired by your example,
data = {'A':(1901,1921),
'B':(1917,1935),
'C':(1929,1948),
'D':(1943,1963),
'E':(1957,1983),
'F':(1975,1991),
'G':(1989,2007)}
# call the function and give its result a name
ax = plot_rect(data)
# so that we can further manipulate it using the `axes` methods, e.g.
ax.set_xlabel('Whatever')
# finally save or show what we have
plt.show()
我们苦难的结果已经显示在这篇post...
的第一段附录
假设你觉得蓝色是一种很沉闷的颜色...
您放置在绘图中的 patches
可以作为绘图的 属性(恰如其分地命名为 patches
...)访问并且也可以修改,例如,
ax = plot_rect(data)
ax.set_xlabel('Whatever')
for rect in ax.patches:
rect.set(facecolor=(0.9,0.9,0.2,1.0), # a tuple, RGBA
edgecolor=(0.6,0.2,0.3,1.0),
linewidth=3.0)
plt.show()
在我的 VH 看来,自定义绘图功能应该是描述情节最不可或缺的功能,因为这种 post 制作通常在 matplotlib
.[=20= 中非常容易]