2014-12-23 3 views
2

저는 tf-idf measure를 사용하여 두 문장/문서 간의 유사성을 찾기 위해 프로젝트 작업을하고 있습니다.파이썬에서 matplotlib를 사용하여 유사성 측정을위한 원을 그릴 때 오류가 발생했습니다.

지금 제 질문은 그래픽/시각화 형식으로 유사점을 표시하는 방법입니다. 교차 값이 유사도 측정이나 matplotlib 또는 모든 파이썬 라이브러리에서 사용 가능한 다른 플롯이되는 Venn 다이어그램과 같은 것입니다.

나는 다음과 같은 코드를 시도 :

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

+1

당신이 그림의 축 보면, 다음, 신속하게 첫번째 원 0의 직경 (가 것을 알 수 있습니다 D1, D2 및 R의 값을 인쇄하는 경우 적어도이 코드를 실행했을 때), 두 번째 그래프는 그래프 테두리 밖으로 완전히 떨어졌습니다. – Evert

+0

더 나은 방법이 있다고해도 'savefig'바로 앞에 다음을 추가하면 더 좋은 방법이 될 것입니다. 물론이 경우에는 반지름이 0 인 원이 표시되지 않습니다. fig.axes [0] .axis ([ min (-d1/2, -d2/2), max (d1, r + d2/2), min (-d1/2, -d2/2), max '. – Evert

답변

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

또한 나는 또한이 코드 조각을 추가하여 다른 질문, 대답!

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_artist, add_patch 등을 통해 아티스트를 수동으로 추가하면 명시 적으로 그렇게하지 않는 한 자동 크기 조정이 적용되지 않습니다. 상위 레벨 함수 (예 : plot)가 위에 빌드 된 matplotlib의 하위 인터페이스에 액세스하고 있습니다. 그러나 이것은 또한 데이터 좌표에 단일 원을 추가하는 가장 쉬운 방법이기 때문에 하위 인터페이스가이 경우 원하는 것입니다.

또한 add_artist은 너무 일반적입니다. 실제로 add_patch (plt.Circlematplotlib.patches.Circle)이 필요합니다. add_artistadd_patch의 차이는 임의로 보일 수 있지만 add_patch은 자동 조절을위한 패치의 범위를 계산하는 추가 로직을 가지고 있습니다. 반면 add_artist은 아티스트를 취할 수있는 "베어"하위 레벨 기능이지만 특별한 것은 수행하지 않습니다. add_artist으로 패치를 추가하면 자동 확장 기능이 제대로 작동하지 않습니다.

을 수동으로 추가 패치 자동 확장에 대한 간단한 예를 들어 : 당신의 다음

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

ax.autoscale()를 호출 추가 한 예술가에 따라 줄거리 오토 스케일하려면 질문은 "왜 원이 둥글지 않은가?"라고 할 수 있습니다. 데이터 좌표계입니다. 그러나 플롯의 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

관련 문제