这是代码:
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具有相同的长度,并且它们是列表。 但由于某种原因,我不断得到这个:
答案 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()
答案 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