Python 是否要使用matplotlib在条形图上添加范围虚线框?

Python 是否要使用matplotlib在条形图上添加范围虚线框?,python,matplotlib,bar-chart,Python,Matplotlib,Bar Chart,我用Birt制作了一个条形图,但由于技术的变化,我现在不得不使用Matplotlib。我想知道是否有可能(以及如何)使用Matplotlib制作类似的图表,特别是围绕顶部80%的条形图的范围虚线正方形,如示例所示: 我没有找到任何关于如何制作的文档 有人知道如何进行吗?类似这样的事情 可以用于虚线框 我还向外移动了脊椎,以匹配绘图样式(代码取自) 类似这样的事情 可以用于虚线框 我还向外移动了脊椎,以匹配绘图样式(代码取自) 我不太清楚你在这里想要什么。如果只是在绘图上添加一个矩形,请参见和一

我用Birt制作了一个条形图,但由于技术的变化,我现在不得不使用Matplotlib。我想知道是否有可能(以及如何)使用Matplotlib制作类似的图表,特别是围绕顶部80%的条形图的范围虚线正方形,如示例所示:

我没有找到任何关于如何制作的文档

有人知道如何进行吗?

类似这样的事情

可以用于虚线框

我还向外移动了
脊椎
,以匹配绘图样式(代码取自)

类似这样的事情

可以用于虚线框

我还向外移动了
脊椎
,以匹配绘图样式(代码取自)


我不太清楚你在这里想要什么。如果只是在绘图上添加一个矩形,请参见和一些。这不仅仅是在页面上绘制一个形状,而是在绘图上80%的数据周围自动生成一个框,在本例中为82%的人口。这样,阅读报告的人就能清楚地看到大部分数据在哪里。这相当于Birt中的“MarkerRangeImpl”。不太清楚你在这里想要什么。如果只是在绘图上添加一个矩形,请参见和一些。这不仅仅是在页面上绘制一个形状,而是在绘图上80%的数据周围自动生成一个框,在本例中为82%的人口。这样,阅读报告的人就能清楚地看到大部分数据在哪里。这相当于Birt中的“MarkerRangeImpl”。好的,非常感谢你,例如tom,我现在知道它是如何工作的了。我不知道矩形的宽度和高度是指实际的轴比例。它使用默认的
transform
,即
ax.transData
。如果您将变换更改为
ax.transAxes
,您可以使用分数轴坐标,例如:
rect=Rectangle((0,0.625),1,0.375,linestyle='smash',facecolor='None',clip\u on=False,transform=ax.transAxes)
给出了与上面相同的框OK非常感谢您的例子tom,我现在知道它是如何工作的了。我不知道矩形的宽度和高度是指实际的轴比例。它使用默认的
transform
,即
ax.transData
。如果将变换更改为
ax.transAxes
,则可以使用分数轴坐标,例如:
rect=Rectangle((0,0.625),1,0.375,linestyle='smash',facecolor='None',clip\u on=False,transform=ax.transAxes)
给出与上述相同的框
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import numpy as np
import matplotlib.ticker as ticker

# Fake some data
x = np.array([15,25,35,45,45,45,45,45,75,75,95,150,160,170,170,1040])
y = np.arange(0.1,16.1,1)
percent = np.array([(100.*float(i)/x.sum()) for i in x])

# Create Figure and Axes
fig,ax = plt.subplots(1)

# Plot the bars
ax.barh(y,x)

# Move left and bottom spines outward by 5 points
ax.spines['left'].set_position(('outward', 5))
ax.spines['bottom'].set_position(('outward', 5))
# Hide the right and top spines
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

# Set the axes limits and tick locations
ax.set_ylim(0,16)
ax.set_yticklabels([])
ax.yaxis.set_major_locator(ticker.MultipleLocator(1))

ax.set_xlim(0,1100)
ax.xaxis.set_major_locator(ticker.MultipleLocator(100))

# Add the rectangle
rect = Rectangle( (0,10), 1100, 6, linestyle = 'dashed', facecolor = 'None', clip_on=False)
ax.add_patch(rect)

# Add the percentage labels
for p,xi,yi in zip(percent,x,y):
    ax.text(xi+5,yi+0.2,'{:2.0f}\%'.format(p))

plt.show()