質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4192閲覧

Python - Flaskでmatplotlib...pltのパラメータが被ってハゲそう

starrow1103

総合スコア137

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2017/04/13 09:17

編集2017/04/13 09:25

#環境
Python 3.6.0
Heroku
Flask

##困っていること
matplotlibを用いて、二種類のグラフ(線グラフと円グラフ)を別々に作りました。
しかし、そこで得た2つのグラフを並べてみると、後に作られた円グラフが線グラフの設定を引きずっているではありませんか。

どうにかこうにかしてみたものの、解決できずにハゲそうになっています。

##こんなかんじ
右側は円グラフになるはずなのです。
イメージ説明

原因は多分、同じタイミングでpltを使っているからだと思いますが、、、

解決策のご教授をよろしくおねがいいたします・・・。

##plot.py(オリジナル)

ちょっとぐちゃぐちゃしてますが、上の関数が線グラフ、下の関数が円グラフです

python

1from flask import Flask,send_file 2from matplotlib import pyplot as plt 3from matplotlib.font_manager import FontProperties 4import numpy as np 5import random 6from io import BytesIO 7 8class Image: 9 def generate_img(image): 10 plt.savefig(image, format='png') 11 image.seek(0) 12 return send_file(image,attachment_filename="hoge.png",as_attachment=True) 13 #↑こいつをflaskのmain.pyでうけとって、<img src="">に使ってる 14 15def line_graph(): 16 data = [i*i**2*random.randint(100,900) for i in range(10)] 17 plt.figure(figsize=(7,5))#グラフの縦横比 18 colors=['#DDB6CC','#A4C0D1','#BAC384','#DFD09D','#C56B3F','#A5908B'] 19 plt.plot(data,'-o',label="ラベル",color=colors[0]) 20 plt.axhline(y=random.randint(100000,300000),lw=1,color='#098765') # x軸に平行に引く,lw=太さ 21 plt.axvline(x=random.randint(1,10),lw=1,color='#123456') # y軸に平行に引く,lw=太さ 22 fp = FontProperties(fname=r'Arial Unicode.ttf', size=12) 23 plt.xticks(range(0,random.randint(10,20))) # x軸メモリの範囲 24 #plt.yticks(range(0,100)) # y軸メモリの範囲 25 plt.xlabel("x軸のラベル",fontproperties=fp) 26 plt.ylabel("y軸のラベル",fontproperties=fp) 27 plt.legend(loc="best",prop=fp)#凡例 28 plt.title("サンプルグラフ",fontproperties=fp) 29 #グラフをオブジェクトに保管 30 image = BytesIO() 31 return Image.generate_img(image) 32 33def circle_graph(): 34 data = np.array([100, 200, 300, 400, 500]) 35 label = ["Apple", "Banana", "Orange", "Grape", "Strawberry"] 36 colors2 = ["0.1", "0.3", "0.5", "0.7", "0.9"] 37 plt.pie(data, labels=label, counterclock=False, startangle=90,colors=colors2) 38 plt.axis('equal') # 楕円になるのを防ぐおまじない 39 #グラフをオブジェクトに保管 40 image = BytesIO() 41 return Image.generate_img(image)

##Flaskのmain.py

python

1from flask import Flask,render_template,send_file 2import os 3import plot # オリジナル 4 5app = Flask(__name__) 6 7@app.route("/") 8def main(): 9 image = "sample.png" 10 image2 = "sample_circle.png" 11 return render_template("index.html",image=image,image2=image2) 12 13@app.route("/sample.png") 14def img(): 15 return plot.line_graph() 16 17@app.route("/sample_circle.png") 18def sircle(): 19 return plot.circle_graph() 20 21if __name__ == "__main__": 22 app.run(debug=True)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このような用途では対話型のプロットは好ましくありません。
オブジェクト指向スタイルを試してみてください。

python

1class Image: 2 def generate_img(fig, image): 3 fig.savefig(image, format='png') 4 image.seek(0) 5 return send_file(image,attachment_filename="hoge.png",as_attachment=True) 6 #↑こいつをflaskのmain.pyでうけとって、<img src="">に使ってる 7 8def line_graph(): 9 fig, ax = plt.subplots(figsize=(7,5)) 10 data = [i*i**2*random.randint(100,900) for i in range(10)] 11 colors=['#DDB6CC','#A4C0D1','#BAC384','#DFD09D','#C56B3F','#A5908B'] 12 ax.plot(data,'-o',label="ラベル",color=colors[0]) 13 ax.axhline(y=random.randint(100000,300000),lw=1,color='#098765') # x軸に平行に引く,lw=太さ 14 ax.axvline(x=random.randint(1,10),lw=1,color='#123456') # y軸に平行に引く,lw=太さ 15 fp = FontProperties(fname=r'Arial Unicode.ttf', size=12) 16 ax.xaxis.set_ticks(range(0,random.randint(10,20))) # x軸メモリの範囲 17 #plt.yticks(range(0,100)) # y軸メモリの範囲 18 ax.set_xlabel("x軸のラベル",fontproperties=fp) 19 ax.set_ylabel("y軸のラベル",fontproperties=fp) 20 ax.legend(loc="best")#凡例 21 ax.set_title("サンプルグラフ",fontproperties=fp) 22 #グラフをオブジェクトに保管 23 image = BytesIO() 24 return Image.generate_img(fig, image) 25 26def circle_graph(): 27 fig, ax = plt.subplots() 28 data = np.array([100, 200, 300, 400, 500]) 29 label = ["Apple", "Banana", "Orange", "Grape", "Strawberry"] 30 colors2 = ["0.1", "0.3", "0.5", "0.7", "0.9"] 31 ax.pie(data, labels=label, counterclock=False, startangle=90,colors=colors2) 32 ax.axis('equal') # 楕円になるのを防ぐおまじない 33 #グラフをオブジェクトに保管 34 image = BytesIO() 35 return Image.generate_img(fig, image)

参考1: http://minus9d.hatenablog.com/entry/2015/01/26/225731

もしくは一つの画像に複数のグラフを並べる方法もあります。

参考2: http://qiita.com/ynakayama/items/8d3b1f7356da5bcbe9bc

投稿2017/04/13 10:25

driller

総合スコア720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

starrow1103

2017/04/13 10:31

回答ありがとうございます!サブプロットでしたそんなのがありましたね、、、 あとでいただいたものを試してみますので、少しお待ちくださいm(_ _)m
starrow1103

2017/04/13 10:58

無事問題を解決することができました!ありがとうございました。
starrow1103

2017/04/13 11:46

追記: 一応問題は解決したのですが、なぜか日本語フォントの文字化けが起こるようになりました。 fontpropertiesを設定制定ない ax.plot(data,'-o',label="ラベル",color=colors[0]) の「ラベル」です。 とりあえずいろいろ試してはみますが、なぜこうなってしまったのでしょうかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問