subplot으로 그림을 더 예쁘게 만듭시다.

1 분 소요

subplot으로 그림을 더 예쁘게 만듭시다.

  • word-embedding을 하고 그 결과를 뿌려주는 과정에서, 학습을 많이 할수록, ‘의미적으로 유사한 단어들이 모인다’는 것을 보여주려고 하는데, 매번 똑같은 그림을 여러번 보여주는 것보다는 하나의 figure안에 subplot으로 넣어주는 것이 훨씬 예쁠 것 같더라구요.
  • 그래서 subplot을 정리해보기로 했씁니다.

just do it

  • 다음처럼 하면 됩니다. 하하핫. plt.figureplt.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()

댓글남기기