不能在pyplot中的点之间连接线

时间:2017-01-20 11:34:46

标签: python matplotlib

这是代码:

 def make_ax(fdist,N):

        ys= list(fdist.values())

        for i in range(len(ys)):
            ys[i] = (ys[i]/N)

        d = (list(fdist.values()))
        c= list(reversed(sorted(list(set(d)))))
        xs =[]
        for i in range(len(d)):

            xs.append((c.index(d[i])+1))

        return xs,ys


 def plot_graph(words):
    fdist = FreqDist(words)
    axis_x,axis_y= make_ax(fdist,len(words))
    plt.figure()
    plt.xlabel('log rank')
    plt.ylabel('log Probability')
    plt.plot(axis_x,axis_y,'ko')

现在,xs和ys具有相同的长度,并且它们是列表。 但由于某种原因,我不断得到这个:

如何在点之间连接线? enter image description here

更新 如果我写plt.plot(axis_x,axis_y,'ko-')它给了我这个: enter image description here

3 个答案:

答案 0 :(得分:2)

您在此处使用nltk,其FreqDist方法会返回未排序的列表 因此,您需要按相反的顺序对该列表进行排序。但是,您无需以任何方式对x值进行排序。

为此目的使用numpy可能是有意义的,但这不是必须的 用于绘制使用linestyle="-"来获取一条线。

以下绘制Herman Melville Moby Dick中80个最常用单词的概率分布

import matplotlib.pyplot as plt
import numpy as np
from nltk import FreqDist
from nltk.book import text1

def make_ax(fdist,N):
        # normalize frequency values
        ys = np.array(fdist.values()) / float(N)
        # sort frequency values, then invert list, such that most frequent words come first
        ys = np.sort(ys)[::-1]
        #create an x range
        xs = np.arange(len(ys))+1.
        return xs,ys


def plot_graph(words):
    fdist = FreqDist(words)
    axis_x,axis_y= make_ax(fdist,len(words))

    plt.figure()
    plt.xlabel('rank') # no log here in this example
    plt.ylabel('Probability')
    plt.plot(axis_x[:80],axis_y[:80], #only plot the 80 most frequent words
             color="k", marker="o", markersize="2", linestyle="-", linewidth=0.8)
    # equall possible:
    # plt.plot(axis_x[:80],axis_y[:80], "ko-")

plot_graph(text1)
plt.show()

enter image description here

答案 1 :(得分:1)

plt.plot(axis_x,axis_y,'ko')替换为plt.plot(axis_x,axis_y,'ko-')-告诉pyplot在点之间绘制线条。

有关选项(线条样式,标记样式等)的详细信息,请参阅plt.plot文档。

修改

我修改了make_ax来对点进行排序:

def make_ax(fdist,N):

    ys= list(fdist.values())

    for i in range(len(ys)):
        ys[i] = (ys[i]/N)

    d = (list(fdist.values()))
    c= list(reversed(sorted(list(set(d)))))
    xs =[]
    for i in range(len(d)):

        xs.append((c.index(d[i])+1))
    # make a list of tuples of coordinates
    points = list(zip(xs, ys)) 
    # sort point according to their x coordinate
    points.sort(key=lambda point: point[0])
    axis_x, axis_y = [], []
    for x, y in points:
        axis_x.append(x)
        axis_y.append(y)
    return axis_x, axis_y

现在,这些线应位于正确的点之间。

答案 2 :(得分:0)

使用plt.plot(axis_x, axis_y, marker='o', color='k' linestyle='solid')或者plt.plot(axis_x, axis_y, marker='o', color='k' linestyle='-')

编写代码的时间越长,但同时也增加了代码的可读性。在python中指定关键字也是一种很好的做法。

plt.plot()的文档:Matplotlib.pyplot.plot