问题出在ticklabels论证中。在python 3.6中,它被视为字典,因此标签以奇怪的重叠方式出现。只需将其转换为 list 解决问题。
list
如果你 print letter_frequency.keys() 在 python 3.6 , 你得到
print letter_frequency.keys()
python 3.6
dict_keys(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'])
如果你这样做的话 python 2.x , 你会得到
python 2.x
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
因此,如果您正在使用 python 3.6 ,转换 letter_frequency.keys() 到列表。 这个 post全面讨论了这个python版本问题。
letter_frequency.keys()
的 码 强>
def plot_distribution(letter_frequency): centers = range(len(LETTERS)) plt.xlabel("Letters") plt.ylabel("Numbers") plt.bar(centers, letter_frequency.values(), align='center', tick_label=list(letter_frequency.keys())) # <--- list conversion plt.xlim([0,len(LETTERS)-1])
依靠字典的顺序总是有点危险。因此,我可以建议以下解决方案,它更短,不需要排序字典。它适用于python 2.7或3.5或更高版本,但需要matplotlib&gt; = 2.2。
from collections import Counter import matplotlib.pylab as plt LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' def frequency_analysis(plain_text): return Counter(plain_text.replace(" ", "").upper()) def plot_distribution(letter_frequency): plt.xlabel("Letters") plt.ylabel("Numbers") plt.bar(list(LETTERS), [letter_frequency[c] for c in LETTERS], align='center') plt.show() if __name__ == "__main__": plain_text = "Shannon defined the quantity of information produced by a source for example, the quantity in a message by a formula similar to the equation that defines thermodynamic entropy in physics. In its most basic terms, Shannon's informational entropy is the number of binary digits required to encode a message. Today that sounds like a simple, even obvious way to define how much information is in a message. In 1948, at the very dawn of the information age, this digitizing of information of any sort was a revolutionary step. His paper may have been the first to use the word bit, short for binary digit. As well as defining information, Shannon analyzed the ability to send information through a communications channel. He found that a channel had a certain maximum transmission rate that could not be exceeded. Today we call that the bandwidth of the channel. Shannon demonstrated mathematically that even in a noisy channel with a low bandwidth, essentially perfect, error-free communication could be achieved by keeping the transmission rate within the channel's bandwidth and by using error-correcting schemes: the transmission of additional bits that would enable the data to be extracted from the noise-ridden signal. Today everything from modems to music CDs rely on error-correction to function. A major accomplishment of quantum-information scientists has been the development of techniques to correct errors introduced in quantum information and to determine just how much can be done with a noisy quantum communications channel or with entangled quantum bits (qubits) whose entanglement has been partially degraded by noise." frequencies = frequency_analysis(plain_text) plot_distribution(frequencies)