복붙노트

[PYTHON] 대화 형 Matplotlib 수치 저장

PYTHON

대화 형 Matplotlib 수치 저장

Matplotlib 그림을 다시 열 수 있고 일반적인 상호 작용을 복원 할 수있는 방법을 저장할 수 있습니까? (MATLAB의 .fig 형식과 비슷합니까?)

필자는 같은 스크립트를 여러 번 실행하여 이러한 대화식 그림을 생성합니다. 또는 동료들에게 여러 정적 PNG 파일을 보내 플롯의 여러 측면을 보여줍니다. 오히려 그림 개체를 보내고 그들과 상호 작용하게하십시오.

해결법

  1. ==============================

    1.이것은 훌륭한 기능이지만 AFAIK는 Matplotlib에 구현되어 있지 않으므로 수치 저장 방법으로 인해 구현하기가 어려울 수 있습니다.

    이것은 훌륭한 기능이지만 AFAIK는 Matplotlib에 구현되어 있지 않으므로 수치 저장 방법으로 인해 구현하기가 어려울 수 있습니다.

    (a) 그림 생성 (별도의 이름을 가진 데이터 저장)과 그림 생성 (저장된 데이터의 지정된 파일 로딩)을 작성하고 적합하게 보거나 편집하여 b ) PDF / SVG / PostScript 형식으로 저장하고 Adobe Illustrator (또는 Inkscape)와 같은 멋진 그림 편집기에서 편집 할 수 있습니다.

    편집 포스트 2012 년 가을 : 다른 사람들이 아래에서 지적했듯이 (이것은 받아 들여진 답변이므로 여기에서 언급했지만) Matplotlib 버전 1.2부터 피클 링을 허용했습니다. 릴리스 노트는 실험적인 기능으로 matplotlib 버전 하나에 그림을 저장하고 다른 matplotlib 버전으로 열기를 지원하지 않습니다. 믿을 수없는 출처의 피클을 복원하는 것은 일반적으로 안전하지 않습니다.

    나중에 중요한 데이터 처리가 필요하고 나중에 과학 출판물에 대한 동료 검토 중에 몇 달을 꼬박 꼬박 꼬박 말해야 할 수도있는 공유 / 나중에 편집하기 위해 (1) 플롯을 생성하기 전에 데이터 처리 스크립트가 있어야합니다. (2) 플롯을 재현하기 위해 별도로 플롯 생성 스크립트 (필요에 따라 조정)가 있어야합니다. 이렇게하면 각 플롯에 대해 신속하게 스크립트를 실행하고 다시 생성 할 수 있으며 새로운 데이터로 플롯 설정을 신속하게 복사 할 수 있습니다. 즉, 수치를 산정하면 단기 / 쌍방향 / 탐색 데이터 분석에 편리 할 수 ​​있습니다.

  2. ==============================

    2.Matplotlib 1.2부터 실험 피클을 지원합니다. 그걸 줘서 네 사건에 잘 작동하는지 확인해. 문제가 있으면 Matplotlib 메일 링리스트에 알려 주시거나 github.com/matplotlib/matplotlib에서 문제를 열어주십시오.

    Matplotlib 1.2부터 실험 피클을 지원합니다. 그걸 줘서 네 사건에 잘 작동하는지 확인해. 문제가 있으면 Matplotlib 메일 링리스트에 알려 주시거나 github.com/matplotlib/matplotlib에서 문제를 열어주십시오.

  3. ==============================

    3.방금이 작업을 수행하는 방법을 알았습니다. @pelson에 언급 된 "실험적인 피클 지원"은 꽤 잘 작동합니다.

    방금이 작업을 수행하는 방법을 알았습니다. @pelson에 언급 된 "실험적인 피클 지원"은 꽤 잘 작동합니다.

    이 시도:

    # Plot something
    import matplotlib.pyplot as plt
    fig,ax = plt.subplots()
    ax.plot([1,2,3],[10,-10,30])
    

    대화 형 조정 후 그림 개체를 이진 파일로 저장합니다.

    import pickle
    pickle.dump(fig, open('FigureObject.fig.pickle', 'wb')) # This is for Python 3 - py2 may need `file` instead of `open`
    

    나중에 그림을 열고 비틀기를 저장하고 GUI 상호 작용이 있어야합니다.

    import pickle
    figx = pickle.load(open('FigureObject.fig.pickle', 'rb'))
    
    figx.show() # Show the figure, edit it, etc.!
    

    플롯에서 데이터를 추출 할 수도 있습니다.

    data = figx.axes[0].lines[0].get_data()
    

    (선, pcolor 및 imshow에서 작동합니다 - pcolormesh는 병합 된 데이터를 재구성하는 몇 가지 트릭과 함께 작동합니다.)

    나는 Pickle을 사용하여 Matplotlib Figures Saving에서 훌륭한 팁을 얻었습니다.

  4. ==============================

    4.파이썬 스크립트를 보내지 않는 이유는 무엇입니까? MATLAB의 .fig 파일은 수신자가 MATLAB을 표시하도록 요구하므로 Matplotlib이 표시되어야하는 Python 스크립트를 보내는 것과 같습니다.

    파이썬 스크립트를 보내지 않는 이유는 무엇입니까? MATLAB의 .fig 파일은 수신자가 MATLAB을 표시하도록 요구하므로 Matplotlib이 표시되어야하는 Python 스크립트를 보내는 것과 같습니다.

    다른 방법으로 (면책 조항 : 나는 아직 시도하지 않았다), 당신은 그 피규어를 씹을 수있다.

    import pickle
    output = open('interactive figure.pickle', 'wb')
    pickle.dump(gcf(), output)
    output.close()
    
  5. ==============================

    5.좋은 질문. 다음은 pylab.save의 doc 텍스트입니다.

    좋은 질문. 다음은 pylab.save의 doc 텍스트입니다.

  6. ==============================

    6.필자는 matplotlib 수치를 저장하는 비교적 단순한 방법 (아직 다소 독창적 인 방법)을 알아 냈습니다. 그것은 다음과 같이 작동합니다 :

    필자는 matplotlib 수치를 저장하는 비교적 단순한 방법 (아직 다소 독창적 인 방법)을 알아 냈습니다. 그것은 다음과 같이 작동합니다 :

    import libscript
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    t = np.arange(0.0, 2.0, 0.01)
    s = 1 + np.sin(2*np.pi*t)
    
    #<plot>
    plt.plot(t, s)
    plt.xlabel('time (s)')
    plt.ylabel('voltage (mV)')
    plt.title('About as simple as it gets, folks')
    plt.grid(True)
    plt.show()
    #</plot>
    
    save_plot(fileName='plot_01.py',obj=sys.argv[0],sel='plot',ctx=libscript.get_ctx(ctx_global=globals(),ctx_local=locals()))
    

    save_plot 함수가 다음과 같이 정의되었습니다 (논리를 이해하기위한 간단한 버전).

    def save_plot(fileName='',obj=None,sel='',ctx={}):
        """
        Save of matplolib plot to a stand alone python script containing all the data and configuration instructions to regenerate the interactive matplotlib figure.
    
        Parameters
        ----------
        fileName : [string] Path of the python script file to be created.
        obj : [object] Function or python object containing the lines of code to create and configure the plot to be saved.
        sel : [string] Name of the tag enclosing the lines of code to create and configure the plot to be saved.
        ctx : [dict] Dictionary containing the execution context. Values for variables not defined in the lines of code for the plot will be fetched from the context.
    
        Returns
        -------
        Return ``'done'`` once the plot has been saved to a python script file. This file contains all the input data and configuration to re-create the original interactive matplotlib figure.
        """
        import os
        import libscript
    
        N_indent=4
    
        src=libscript.get_src(obj=obj,sel=sel)
        src=libscript.prepend_ctx(src=src,ctx=ctx,debug=False)
        src='\n'.join([' '*N_indent+line for line in src.split('\n')])
    
        if(os.path.isfile(fileName)): os.remove(fileName)
        with open(fileName,'w') as f:
            f.write('import sys\n')
            f.write('sys.dont_write_bytecode=True\n')
            f.write('def main():\n')
            f.write(src+'\n')
    
            f.write('if(__name__=="__main__"):\n')
            f.write(' '*N_indent+'main()\n')
    
    return 'done'
    

    또는 save_plot 함수를 다음과 같이 정의하는 것 (좀 더 가벼운 그림 파일을 생성하기 위해 zip 압축을 사용하는 더 나은 버전) :

    def save_plot(fileName='',obj=None,sel='',ctx={}):
    
        import os
        import json
        import zlib
        import base64
        import libscript
    
        N_indent=4
        level=9#0 to 9, default: 6
        src=libscript.get_src(obj=obj,sel=sel)
        obj=libscript.load_obj(src=src,ctx=ctx,debug=False)
        bin=base64.b64encode(zlib.compress(json.dumps(obj),level))
    
        if(os.path.isfile(fileName)): os.remove(fileName)
        with open(fileName,'w') as f:
            f.write('import sys\n')
            f.write('sys.dont_write_bytecode=True\n')
            f.write('def main():\n')
            f.write(' '*N_indent+'import base64\n')
            f.write(' '*N_indent+'import zlib\n')
            f.write(' '*N_indent+'import json\n')
            f.write(' '*N_indent+'import libscript\n')
            f.write(' '*N_indent+'bin="'+str(bin)+'"\n')
            f.write(' '*N_indent+'obj=json.loads(zlib.decompress(base64.b64decode(bin)))\n')
            f.write(' '*N_indent+'libscript.exec_obj(obj=obj,tempfile=False)\n')
    
            f.write('if(__name__=="__main__"):\n')
            f.write(' '*N_indent+'main()\n')
    
    return 'done'
    

    이것은 주로 모듈 inspect와 ast에 의존하는 내 자신의 모듈 libscript를 사용합니다. 관심이 표명되면 Github에서 공유하려고 할 수 있습니다 (Github을 시작하려면 먼저 정리가 필요합니다).

    이 save_plot 함수와 libscript 모듈 뒤에있는 아이디어는 (모듈 inspect를 사용하여) figure를 생성하고 모듈 ast를 사용하여 분석하여 모든 변수, 함수 및 모듈을 추출하는 python 명령어를 가져 오는 것입니다. 컨텍스트를 만들고 파이썬 명령어로 직렬화하십시오 (변수 코드는 t = [0.0,2.0,0.01] ...와 같을 것이며 모듈의 코드는 import matplotlib.pyplot을 plt ...와 같이 사용합니다). 결과 파이썬 명령어는 python 스크립트로 저장되어 실행시 원래의 matplotlib 그림이 다시 빌드됩니다.

    상상할 수 있듯이 이것은 대부분의 matplotlib 수치 (모든 것이 아닐지라도)에서 잘 작동합니다.

  7. from https://stackoverflow.com/questions/4348733/saving-interactive-matplotlib-figures by cc-by-sa and MIT license