我正在使用Python中的Matplotlib使用matplotlib.bar()
函数绘制直方图。这给了我看起来像这样的情节:
我正在尝试制作一个直方图,只绘制每个条形图的大写字母和不与另一个条形边框直接共享空间的边,更像是这样:(我使用gimp编辑了这个)
如何使用Python实现这一目标?使用matplotlib
的答案更可取,因为这是我最有经验的,但我对使用Python的任何东西都持开放态度。
对于它的价值,这是相关的代码:
import numpy as np
import matplotlib.pyplot as pp
bin_edges, bin_values = np.loadtxt("datafile.dat",unpack=True)
bin_edges = np.append(bin_edges,500.0)
bin_widths = []
for j in range(len(bin_values)):
bin_widths.append(bin_edges[j+1] - bin_edges[j])
pp.bar(bin_edges[:-1],bin_values,width=bin_widths,color="none",edgecolor='black',lw=2)
pp.savefig("name.pdf")
答案 0 :(得分:4)
我想最简单的方法是使用step函数而不是bar: http://matplotlib.org/examples/pylab_examples/step_demo.html
示例:
import numpy as np
import matplotlib.pyplot as pp
# Simulate data
bin_edges = np.arange(100)
bin_values = np.exp(-np.arange(100)/5.0)
# Prepare figure output
pp.figure(figsize=(7,7),edgecolor='k',facecolor='w')
pp.step(bin_edges,bin_values, where='post',color='k',lw=2)
pp.tight_layout(pad=0.25)
pp.show()
如果您给出的bin_edges代表左边缘,请使用=' post&#39 ;;如果他们是rightern方面使用=' pre'。我看到的唯一问题是,如果您使用post(pre),则步骤并不能正确绘制最后一个(第一个)bin。但是你可以在你的数据之前/之后添加另一个0 bin来使它正确地绘制所有内容。
示例2 - 如果您想要存储一些数据并绘制直方图,您可以执行以下操作:
# Simulate data
data = np.random.rand(1000)
# Prepare histogram
nBins = 100
rng = [0,1]
n,bins = np.histogram(data,nBins,rng)
x = bins[:-1] + 0.5*np.diff(bins)
# Prepare figure output
pp.figure(figsize=(7,7),edgecolor='k',facecolor='w')
pp.step(x,n,where='mid',color='k',lw=2)
pp.show()