subplot으로 그림을 더 예쁘게 만듭시다.
subplot으로 그림을 더 예쁘게 만듭시다.
- word-embedding을 하고 그 결과를 뿌려주는 과정에서, 학습을 많이 할수록, ‘의미적으로 유사한 단어들이 모인다’는 것을 보여주려고 하는데, 매번 똑같은 그림을 여러번 보여주는 것보다는 하나의 figure안에
subplot
으로 넣어주는 것이 훨씬 예쁠 것 같더라구요. - 그래서 subplot을 정리해보기로 했씁니다.
just do it
- 다음처럼 하면 됩니다. 하하핫.
plt.figure
나plt.axe
나 별 차이 없다고 생각하면 됩니다. 원래는plt.scatter
로 그림을 그려줬다면, 지금은axe.scatter
라는 것이 차이라고 할 수 있겠네요. - 단, 가능하면
set_title
을 통해서 해당 axe가 무엇인지 설명해주는 것이 포함되면 좋겠습니다.
import matplotlib.pyplot as plt
import numpy as np
f, axes = plt.subplots(1, 4, sharex=True, sharey=True)
"""figure의 크기를 조정, 원래 하던 방식인 f.figsize=(16, 4)로는 낫 워킹.
"""
f.set_size_inches((16, 4))
for i in range(0, 4):
axes[i].scatter(np.random.random(30), np.random.random(30), alpha=0.7)
axes[i].set_title("axe {}".format(i))
plt.savefig('../../assets/images/markdown_img/pl_subplot_180515.svg')
plt.show()
원래 하려던 것에 적용해 봅니다.
- 원하던 대로 되었습니다. 마음에 드네여. 예쁘군요.
from gensim.models.word2vec import Word2Vec
import matplotlib.pyplot as plt
"""
3차원으로 변경하여 보여주는 것도 괜찮을 것 같은데 흠.
"""
f, axes = plt.subplots(2, 2, sharex=False, sharey=False)
f.set_size_inches((16, 6))
for i in range(0, 2):
for j in range(0, 2):
sample_n = [1, 100, 500, 1000][i*2+j]
sent_lst = ["I am a boy", "I am a girl", "I am a dog"]*sample_n
sent_split_lst = map(lambda s: list(s.lower().split(" ")), sent_lst)
model = Word2Vec(list(sent_split_lst), size=2, window = 3, min_count=1)
model.init_sims(replace=True)# 학습 완료 후, 필요없는 메모리 삭제
for x, y, t in ((model.wv.get_vector(w)[0], model.wv.get_vector(w)[0], w) for w in model.wv.index2entity):
axes[i][j].scatter(x, y, cmap=plt.cm.rainbow)
axes[i][j].text(x+0.01, y, t, fontsize=12)
axes[i][j].set_title("sample size = {}".format(sample_n))
f.tight_layout()# 그냥 이걸로 다 해결되었다.
plt.savefig('../../assets/images/markdown_img/word_embedding_subplot_20180515.svg')
plt.show()
댓글남기기