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