8

我正在尝试使用 matplotlib 绘制一个简单的直方图。例如(我将在实践中使用不同的距离函数)

import matplotlib.pyplot as plt
import numpy as np
import itertools


def hamdist(str1, str2):
    """Count the # of differences between equal length strings str1 and str2"""
    if (len(str1) != len(str2)):
        print str1, str2, "Length mismatch bozo!!!!!!"
    diffs = 0
    for ch1, ch2 in itertools.izip(str1, str2):
        if ch1 != ch2:
            diffs += 1
    return diffs

n = 10
bins=np.arange(0,n+2,1)
hamdists = []
for str1 in itertools.product('01', repeat = n):
    for str2 in itertools.product('01', repeat = n):
        hamdists.append(hamdist(str1, str2))
plt.hist(hamdists, bins=bins)
plt.show()

我得到一个看起来像这样的直方图。

直方图

如何执行以下操作?

  1. 更改 x 轴,以便最后一个条计算 x = 10 的数字。如果我简单地更改为bins=np.arange(0,11,1)这个,则切断 x = 10 的值。
  2. 标记 x 轴上的每个点
  3. 将 x 轴标签移动到条形的中间下方,而不是像现在这样位于它们的开头。
4

1 回答 1

20

您的第一点和第三点可以通过设置 histogram 函数的 align 关键字来解决(默认为“mid”,即 bin 的中心)。第二个通过手动设置 xticks。

看:

fig, ax = plt.subplots(1,1)

ax.hist(hamdists, bins=bins, align='left')
ax.set_xticks(bins[:-1])

在此处输入图像描述

于 2013-05-02T08:26:14.890 回答