데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      igraph와 plotly로 분자구조 그리기

      joyhong 22.02.23
      3,626 5 2

      이번 글에서는 igraph와 plotly를 활용하여 분자구조를 2D와 3D로 그려보도록 한다.

      데이터는 지난 블로그에서 생성한 아스피린 분자구조 그래프 데이터를 활용한다.

      igraph는 파이썬, R, C 등의 언어로 네트워크 분석을 할 수 있는 도구이다.

      공식 홈페이지

      https://igraph.org/

       

      3D로 분자구조를 그리기 위해서 plotly chart-studio의 scatter3d를 활용하도록 한다.

      https://plotly.com

       

      활용하는 라이브러리

      !pip install igraph 
      !pip install chart-studio 
      !pip install kaleido 
      !pip install pycairo
      
      

       

      라이브러리 임포트

      import json
      import igraph as ig
      from chart_studio import plotly as py
      import plotly.graph_objs as go
      import numpy as np

       

      2D로 아스피린 분자구조 그리기

      지난 블로그에서 생성해 둔  JSON 형태의 데이터를 로딩해야 한다.

      with open('graphData.json') as f:
          data = json.load(f)
      N=len(data['nodes'])
      L=len(data['links'])
      Edges=[(data['links'][k]['source'], data['links'][k]['target']) for k in range(L)]

      노드와 엣지를 N과 Edges에 담아 두었다.

       

      다음으로 엣지를 활용하여 그래프를 생성한다. 엣지에는 소스와 타켓이 들어있기 때문에 엣지를 읽어서 그래프를 생성할 수 있다.

      G=ig.Graph(Edges, directed=False)
      labels=[]
      group=[]
      for node in data['nodes']:
          labels.append(node['name'])
          group.append(node['group'])
      
      link_labels=[]
      for link in data['links']:
          link_labels.append(link['label'])

      노드의 레이블과 노드 그룹별 색상을 위해 각각 리스트에 담았다.

       

      그래프는 igraph의 plot을 써서 그래프 데이터와 레이아웃을 정해주면 간단하게 그리게 된다.

      layt=G.layout('kk', dim=2)
      ig.plot(G, layout=layt, vertex_label=labels, bbox=(300,300))

      여기서 적용한 레이아웃은 2차원의 Kamada-Kawai layout algorithm 이다.

       

      3D로 그리기

      먼저 2차원의 레이아웃을 3차원으로 생성하도록 한다.

      layt=G.layout('kk', dim=3)

      다음으로는 이 레이아웃을 통해 3차원으로 그리기 위한 좌표를 생성해야 한다.

      Xn=[layt[k][0] for k in range(N)]
      Yn=[layt[k][1] for k in range(N)]
      Zn=[layt[k][2] for k in range(N)]
      Xe=[]
      Ye=[]
      Ze=[]
      
      for e in Edges:
          Xe+=[[layt[e[0]][0],layt[e[1]][0], None]]
          Ye+=[[layt[e[0]][1],layt[e[1]][1], None]]
          Ze+=[[layt[e[0]][2],layt[e[1]][2], None]]

      3D를 그릴 때 엣지를 그 종류에 따라 색상과 스타일을 적용해 보겠다.

      traces = {}
      line_style = {
          "SINGLE" : {"color":"gray", "width":2, "dash":"solid"},
          "AROMATIC" : {"color":"blue", "width":4, "dash":"longdashdot"},
          "DOUBLE" : {"color":"red", "width":5, "dash":"longdash"},
          
      }
      for i in range(0, len(Edges)):
          traces['trace_'+str(i)] = go.Scatter3d(x=Xe[i],
                                                y=Ye[i],
                                                z=Ze[i],
                                                mode='lines+text',
                                                hoverinfo='none'
                                                )
      
      trace_node=go.Scatter3d(x=Xn,
                     y=Yn,
                     z=Zn,
                     mode='markers+text',
                     name='actors',
                     marker=dict(symbol='circle',
                                   size=6,
                                   color=group,
                                   colorscale='Viridis',
                                   line=dict(color='rgb(50,50,50)', width=0.5)
                                   ),
                     text=labels,
                     textposition='bottom center',
                     hoverinfo='text'
                     )
      
      axis=dict(showFalse,
                showline=False,
                zeroline=False,
                showgrid=False,
                showticklabels=False,
                title=''
                )
      
      layout = go.Layout(
               width=700,
               height=700,
               showlegend=False,
               scene=dict(
                   xaxis=dict(axis),
                   yaxis=dict(axis),
                   zaxis=dict(axis),
              ),
           margin=dict(
              t=100
          ),
          hovermode='closest',
      )

      Figure의 입력으로 위에서 생성한 trace들을 넣어주면 3D가 그려진다.

      traces_link = list(traces.values()) 
      traces_link.append(trace_node) 
      
      fig=go.Figure(data=traces_link, layout=layout)
      fig

       

      HTML 로 저장

      생성한 이미지는 html로 저장이 가능하다.

      import plotly.express as px
      
      fig.write_html('plotly_graph.html')


       

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      joyhong 님의 최신 블로그

      더보기
      동영상 기고하기