kuroの覚え書き

96の個人的覚え書き

カテゴリープロット、ボックスプロット、バイオリンプロット

最近Nature系の論文は投稿時に平均値+エラーバーだけでなく、全データ点をプロットしたグラフを要求するようになった。
投稿サイトでもそういうグラフをオンラインで作ってくれるサイトが紹介されているのでそれを使えばいいのだが、みんなそのサイトを使ってグラフを書き直しているためか、どれもこれもみんな似たようなグラフになっていてキモい。
ということで、自前で描画できるアプリを作ろうということでいつものようにPythonでプログラムを書く。
と言ってもmatplotlibとseabornで描かせるだけなので自作というのもおこがましいのだが。

f:id:k-kuro:20200804233920p:plain

サクサクっと完成。これをexcelで作ったグラフに重ねてしまえばOK。

ついでに、最近良く見るようになったバイオリンプロットも描けるようにしてみた。
f:id:k-kuro:20200804234038p:plain

Flaskのプログラムにいつものように継ぎ足しているので、ライブラリのインポートやformとかの定義は省略しているが、ソースは以下のような感じ。

@app.route('/cat_graph', methods=['GET', 'POST'])
def cat_graph_index():
    user = g.user.name
    form=StatForm()
    dir = "./user/" + user + "/graph"
    if os.path.exists(dir):
        shutil.rmtree(dir)
    if not os.path.exists(dir):
        os.makedirs(dir)
    input = dir + "/input.txt"
    output = dir + "/output.txt"


    if request.method == 'POST':
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            if form.samp1.data:
                samp = form.samp1.data.strip()
                f = open(input, 'w')
                f.write(samp)
                f.close()
            else:
                flash('No data input')
                return redirect(request.url)
        if file and allowed_file(file.filename):
            file.save(input)

    if os.path.exists(input):
        if form.fig_x.data:
            fig_x=form.fig_x.data
        if form.fig_y.data:
            fig_y=form.fig_y.data

        if form.data_f.data=='csv':
            df = pd.read_csv(input)
        if form.data_f.data=='tsv':
            df = pd.read_table(input)

        graph_figa = dir + "/graph_" + str(time.time()) + ".eps"
        graph_fig = dir + "/graph_" + str(time.time()) + ".png"

        # X = df.iloc[:, 1:].apply(lambda x: (x-x.mean())/x.std(), axis=0)

        if form.graph_type.data == "cat":
            if form.jitter.data:
                sns.catplot(x=df.columns.values[0],y=df.columns.values[1], data=df)
            else:
                sns.catplot(x=df.columns.values[0],y=df.columns.values[1], data=df, jitter=False)

            plt.savefig(graph_figa)
            plt.savefig(graph_fig)

            img_url = "../../static/" + graph_fig

            return render_template('/tools/cat_graph.html', form=form, img_url=img_url)

        if form.graph_type.data == "box":
            sns.catplot(x=df.columns.values[0],y=df.columns.values[1], data=df, kind='box')
            plt.savefig(graph_fig)
            plt.savefig(graph_figa)

            img_url = "../../static/" + graph_fig

            return render_template('/tools/cat_graph.html', form=form, img_url=img_url)

        if form.graph_type.data == "violin":
            sns.catplot(x=df.columns.values[0],y=df.columns.values[1], data=df, kind='violin')
            plt.savefig(graph_fig)
            plt.savefig(graph_figa)

            img_url = "../../static/" + graph_fig

            return render_template('/tools/cat_graph.html', form=form, img_url=img_url)

    return render_template('/tools/cat_graph.html', form=form)

@app.route('/graph/dl/')
def dl_graph_index():
    user = g.user.name
    dir = "./user/" + user + "/graph"
    file = "./user/" + user + "/graph_figs"
    if os.path.exists(dir):
        shutil.make_archive(file, 'zip', dir)

    downloadFileName = 'figs' + str(time.time()) + '.zip'
    downloadFile = "./static/user/" + user + '/graph_figs.zip'

    return send_file(downloadFile, as_attachment = True, attachment_filename = downloadFileName)