python - python 3.7中使用matplotlib的黑噪声

标签 python dictionary matplotlib

我在 python 3.7 中运行此代码:

import matplotlib.pylab as plt

LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'


def frequency_analysis(plain_text):

    #the text we analyise
    plain_text = plain_text.upper()

    #we use a dictionary to store the letter-frequency pair
    letter_frequency = {}

    #initialize the dictionary (of course with 0 frequencies)
    for letter in LETTERS:
        letter_frequency[letter] = 0

    #let's consider the text we want to analyse 
    for letter in plain_text:
        #we keep incrementing the occurence of the given letter
        if letter in LETTERS:
            letter_frequency[letter] += 1

    return letter_frequency

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=letter_frequency.keys())
    plt.xlim([0,len(LETTERS)-1])
    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)

我得到这个输出:它在 x 轴上有黑噪声。

enter image description here

这是我在 python 2.7 上运行相同代码时的输出:

enter image description here

python 2.7中不再出现黑噪声

有什么解决方案可以消除python 3.7中的黑噪声

最佳答案

问题出在刻度标签参数中。在 python 3.6 中,它被视为字典,因此标签以奇怪的重叠方式出现。只需将其转换为列表即可解决问题。

如果您在 python 3.6打印 letter_Frequency.keys(),您会得到

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中做同样的事情,你会得到

['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() 转换为列表。 This帖子全面讨论了这个python版本问题。

<小时/> <小时/>

代码

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])

enter image description here

关于python - python 3.7中使用matplotlib的黑噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54134747/

相关文章:

python - 为嵌套字典获取 2 个具有最高值的键

python - Matplotlib 动画不显示

python - 强制 pyplot 显示实际轴值

python - 从字典中的迭代中删除 "None"

python - Python 的 difflib.HtmlDiff 的语义标记

python - CSRF 验证失败 - Django

python - Pandas 平均重复的枢轴点

python 请求和 cx_freeze

python - 带花括号的字典和 OrderedDict

python - 如何在字典中找到树的第一个节点?