使用python中的matplotlib绘制相似性度量的圆形图时出错

时间:2014-12-23 12:14:33

标签: python matplotlib plot visualization

我正在研究项目,使用tf-idf measure来查找两个句子/文档之间的相似性。

现在我的问题是如何以图形/可视化格式显示相似性。类似于维恩图,其中交叉值成为相似性度量或matplotlib或任何python库中可用的任何其他图。

我尝试了以下代码:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity  

documents = (
"The sky is blue",
"The sun is bright"

)
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)
print tfidf_matrix
cosine = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix)
print cosine
import matplotlib.pyplot as plt
r=25
d1 = 2 * r * (1 - cosine[0][0])
circle1=plt.Circle((0,0),d1/2,color='r')
d2 = 2 * r * (1 - cosine[0][1])
circle2=plt.Circle((r,0),d2/2,color="b")
fig = plt.gcf()
fig.gca().add_artist(circle1)
fig.gca().add_artist(circle2)
fig.savefig('plotcircles.png')
plt.show()

但我得到的情节是空的。有人可以解释可能是错误的原因。

绘制圆形来源:plot a circle

2 个答案:

答案 0 :(得分:4)

只是为了解释发生了什么,这里有一个独立的问题示例(如果圆圈完全在边界之外,则不会显示任何内容):

import matplotlib.pyplot as plt
from matplotlib.patches import Circle

fig, ax = plt.subplots()
circ = Circle((1, 1), 0.5)
ax.add_artist(circ)
plt.show()

enter image description here

当您通过add_artistadd_patch等手动添加艺术家时,除非您明确这样做,否则不会应用自动缩放。您正在访问matplotlib的较低级别界面,该界面包含更高级别的功能(例如plot)。但是,这也是在数据坐标中添加单个圆的最简单方法,因此在这种情况下,您需要的是低级接口。

此外,add_artist对此非常笼统。您实际上想要add_patchplt.Circlematplotlib.patches.Circle)。 add_artistadd_patch之间的差异似乎是任意的,但add_patch有额外的逻辑来计算自动缩放的补丁范围,而add_artist是"裸& #34;可以带任何艺术家的低级功能,但不做任何特别的事情。如果您使用add_artist添加补丁,则自动缩放功能无法正常运行。

要根据您添加的艺术家自动缩放图表,请致电ax.autoscale()

作为自动缩放手动添加的补丁的快速示例:

import matplotlib.pyplot as plt
from matplotlib.patches import Circle

fig, ax = plt.subplots()
circ = Circle((1, 1), 0.5)
ax.add_patch(circ)
ax.autoscale()
plt.show()

enter image description here

你的下一个问题可能是"为什么圈子不圆?"。它是,在数据坐标中。然而,图的x和y标度(这是matplotlib术语中的纵横比)目前是不同的。要强制它们相同,请致电ax.axis('equal')ax.axis('scaled')。 (在这种情况下,我们实际上可以忽略对autoscale的调用,因为ax.axis('scaled'/'equal')会有效地为我们调用它。):

import matplotlib.pyplot as plt
from matplotlib.patches import Circle

fig, ax = plt.subplots()
circ = Circle((1, 1), 0.5)
ax.add_patch(circ)
ax.axis('scaled')
plt.show()

enter image description here

答案 1 :(得分:1)

情节不是空的,但我想,你的圈子很大!

我没有安装sklearn,所以我从print cosine开始:

## set constants
r = 1
d = 2 * r * (1 - cosine[0][1])

## draw circles
circle1=plt.Circle((0, 0), r, alpha=.5)
circle2=plt.Circle((d, 0), r, alpha=.5)
## set axis limits
plt.ylim([-1.1, 1.1])
plt.xlim([-1.1, 1.1 + d])
fig = plt.gcf()
fig.gca().add_artist(circle1)
fig.gca().add_artist(circle2)
## hide axes if you like
# fig.gca().get_xaxis().set_visible(False)
# fig.gca().get_yaxis().set_visible(False)
fig.savefig('venn_diagramm.png')

这也回答了你的另一个问题,我也添加了这段代码!