我试图用matplotlib绘制直方图,并在各个条之间留出一点空间。因此我设置了rwidth=0.9
。这是输出:
有没有办法避免故障?设置rwidth
的较低值可确保所有条形图分开,但空间宽度仍然存在明显差异:
我正在使用matplotlib版本2.0.2。如果有帮助,这是pip freeze
:
appdirs==1.4.3
bleach==2.0.0
bokeh==0.12.9
callcatcher==1.2.0
certifi==2017.7.27.1
chardet==3.0.4
cycler==0.10.0
decorator==4.1.2
entrypoints==0.2.3
graphviz==0.8
holoviews==1.8.4
html5lib==0.999999999
idna==2.6
ipykernel==4.6.1
ipython==6.2.0
ipython-genutils==0.2.0
ipywidgets==7.0.1
jedi==0.11.0
Jinja2==2.9.6
jsonschema==2.6.0
jupyter==1.0.0
jupyter-client==5.1.0
jupyter-console==5.2.0
jupyter-core==4.3.0
MarkupSafe==1.0
matplotlib==2.0.2
mistune==0.7.4
nbconvert==5.3.1
nbformat==4.4.0
notebook==5.1.0
numpy==1.13.2
packaging==16.8
pandas==0.20.3
pandocfilters==1.4.2
param==1.5.1
parso==0.1.0
pexpect==4.2.1
pickleshare==0.7.4
pkg-resources==0.0.0
prompt-toolkit==1.0.15
ptyprocess==0.5.2
Pygments==2.2.0
pyparsing==2.2.0
python-dateutil==2.6.1
pytz==2017.2
PyYAML==3.12
pyzmq==16.0.2
qtconsole==4.3.1
requests==2.18.4
scipy==0.19.1
seaborn==0.8.1
simplegeneric==0.8.1
six==1.11.0
terminado==0.6
testpath==0.3.1
tornado==4.5.2
traitlets==4.3.2
urllib3==1.22
wcwidth==0.1.7
webencodings==0.5.1
widgetsnbextension==3.0.3
xonsh==0.3.2
感谢任何帮助,谢谢!
的Lukas
答案 0 :(得分:3)
我认为这个行为是在2.0版本的matplotlib中引入的(至少我记不起它在以前的版本中就像现在一样糟糕,但我可能在这里错了)并且可以认为它是一个bug。可以在issue tracker报告错误。当然,存在不存在最佳解决方案的情况(即,如果条非常薄)。
以下是如何解决问题的一些注意事项。
首先,请注意,由于使用了矢量格式,导出为pdf的数字不会出现不等条宽的问题。因此,对于出版物或类似文件,使用pdf绝对是一个可以考虑的选择。
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")
因为pdf工作正常,您可以将pdf转换为png,例如通过imagemagick
> convert -density 300 -trim test.pdf test.png
您可以创建分辨率更高的png图像。即将dpi
更改为200以上的值可能已经为您提供了所需的输出
plt.savefig(__file__+".pdf", dpi=288)
在Jupyter笔记本中工作时,您也可以将数字的dpi设置为更高的值
plt.rcParams["figure.dpi"] = 288
所有数字或
plt.figure(dpi=288)
为了避免上面这个巨大的图像,你可以代替显示实际图形,显示高度dpi的数字,但是将输出的宽度设置为较小的值。这有点单调乏味,但当然可以复制粘贴以下功能以便重复使用。
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())
答案 1 :(得分:0)
Histogram上的连续条之间应该没有间隙:"由于相邻的区间没有间隙,直方图的矩形相互接触以指示原始变量是连续的。[{ {3}}]"
我不认为这是一个matplotlib故障。尝试减少垃圾箱数量或增加图表大小,您可能会看到条形图之间的间隙。我说可能是因为它取决于你的浏览器如何呈现直方图。
要设置直方图的大小,您必须设置figsize
;图中的宽度和高度(英寸)。
plt.figure(figsize=(12, 5))
plt.hist(x, bins=50, normed=True, rwidth=0.9);