<p>我认为这种行为是在2.0版的matplotlib中引入的(至少我不记得在以前的版本中这种情况会像现在这样糟糕,但我在这里可能是错的),人们可以认为它是一个bug。bug可以在<a href="https://github.com/matplotlib/matplotlib/issues" rel="nofollow noreferrer">issue tracker</a>上报告。当然,在某些情况下,不可能存在最佳解决方案(即,如果钢筋非常薄)。在</p>
<p>以下是关于如何处理这个问题的一些考虑。在</p>
<ul>
<li><p>首先,请注意,由于使用的是矢量格式,导出为pdf的图形不存在条形宽度不等的问题。因此,对于出版物或类似的,使用PDF绝对是一个可以考虑的选项。在</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(5000)
plt.hist(x,bins=50, rwidth=0.9)
plt.savefig(__file__+".pdf")
</code></pre></li>
<li><p>因为pdf工作正常,您可以将pdf转换为png,例如通过imagemagick</p>
<pre><code>> convert -density 300 -trim test.pdf test.png
</code></pre></li>
<li><p>您可以创建一个更高分辨率的png图像。一、 将<code>dpi</code>更改为高于200的值可能已经得到了所需的输出</p>
<pre><code>plt.savefig(__file__+".pdf", dpi=288)
</code></pre>
<p><a href="https://i.stack.imgur.com/GXs4M.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/GXs4M.png" width="330"/></a></p></li>
<li><p>在Jupyter笔记本中工作时,也可以将数字的dpi设置为更高的值</p>
<pre><code>plt.rcParams["figure.dpi"] = 288
</code></pre>
<p>所有数字或</p>
<pre><code>plt.figure(dpi=288)
</code></pre>
<p>为一个单一的数字。缺点可能是数字太大。<br/>
<a href="https://i.stack.imgur.com/7vbJz.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/7vbJz.png" width="330"/></a></p></li>
<li><p>为了避免上面的大图像,您可以不显示实际的图形,而是显示高dpi的图形,但将输出的宽度设置为一些较小的值。这有点乏味,但当然可以复制粘贴下面的函数以供重用。在</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
from IPython.display import Image, display
import io
def display_figure(fig=None):
if not fig: fig=plt.gcf();
buff = io.BytesIO()
fig.savefig(buff, dpi=288)
buff.seek(0)
display(Image(data=buff.getvalue(), width=480))
x = np.random.randn(5000);
plt.hist(x,bins=50, rwidth=0.9);
display_figure(plt.gcf())
</code></pre>
<p><a href="https://i.stack.imgur.com/uKUxr.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/uKUxr.png" alt="enter image description here"/></a></p></li>
</ul>