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

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

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

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

Python

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

Q&A

解決済

1回答

2140閲覧

matplotlibのグラフの体裁を記述した外部ファイルを読み込む方法

loreeeee

総合スコア40

Matplotlib

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

Python

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

0グッド

0クリップ

投稿2020/07/17 00:43

編集2020/07/18 03:15

前提・実現したいこと

下記ソースコードのようなmatplotlibでグラフの体裁を記述した部分を毎回描画するプログラムに記述するのが面倒です。

そこで下記コードを記述したファイルをmatplotlib_ini_setting.pyのような名前で保存し、
/home/users/original_prog/といったディレクトリに置いて
/home/work/以下でプログラムを書くときに、/home/users/original_prog/matplotlib_ini_setting.pyを呼び出して利用する方法はありますか?

該当のソースコード

python

1import matplotlib.pyplot as plt 2 3plt.rcParams['font.family'] ='sans-serif'#使用するフォント 4plt.rcParams['xtick.direction'] = 'in'#x軸の目盛線が内向き('in')か外向き('out')か双方向か('inout') 5plt.rcParams['ytick.direction'] = 'in'#y軸の目盛線が内向き('in')か外向き('out')か双方向か('inout') 6plt.rcParams['xtick.major.width'] = 2.0#x軸主目盛り線の線幅 7plt.rcParams['ytick.major.width'] = 2.0#y軸主目盛り線の線幅 8plt.rcParams['font.size'] = 16 #フォントの大きさ 9plt.rcParams['axes.linewidth'] = 2.0# 軸の線幅edge linewidth。囲みの太さ 10 11plt.figure(figsize=(6,6)) 12 13plt.gca().xaxis.set_major_formatter(plt.FormatStrFormatter('%.3f'))#y軸小数点以下3桁表示 14plt.gca().yaxis.set_major_formatter(plt.FormatStrFormatter('%.3f'))#y軸小数点以下3桁表示 15plt.locator_params(axis='y',nbins=6)#y軸,6個以内. 16plt.gca().yaxis.set_tick_params(which='both', direction='in',bottom=True, top=True, left=True, right=True) 17 18plt.tight_layout()#グラフが重ならず,設定した図のサイズ内に収まる。 19plt.savefig('figname.pdf', transparent=True) 20plt.savefig('figname.png', transparent=True, dpi=300) 21 22#plt.contour(X, Y, Z, cmap='viridis') # viridisの配色で等高線を描く 23plt.show()

出力図(この体裁でグラフを描きたい)
イメージ説明

実行環境 anaconda python3 (mac)

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

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

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

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

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

guest

回答1

0

ベストアンサー

matplotlibrc に設定を記述しておけば、import matplotlib.pyplot したときに読み込まれます。
matplotlibrc はデフォルトでは存在しないので、以下のコードをコピペして実行すれば作成できます。
作成場所は <ホームディレクトリ>/.config/matplotlib/matplotlibrc になるので、作成したあとにテキストエディタで適宜編集してください。

matplotlib - コピペするだけで matplotlib を日本語化する方法

追記

python

1import shutil 2from pathlib import Path 3 4import matplotlib as mpl 5 6# 設定ファイルをコピーする。 7config_dir = Path(mpl.get_configdir()) 8config_dir.mkdir(exist_ok=True, parents=True) 9 10default_config_path = Path(mpl.__file__).parent / "mpl-data/matplotlibrc" 11config_path = config_dir / "matplotlibrc" 12print(f"設定ファイルの場所 {config_path}") 13shutil.copyfile(default_config_path, config_path)

追記

matplotlibrc は matplotlib のデフォルト設定を記述するファイルです。
Python のスクリプトをペタっと貼るのではなく、設定ファイルのフォーマットに従って、設定を追記します。どのように書けばいいかはコメントアウトされている各種設定項目に書いてあります。

例えば、質問の内容だと以下を追記すればよいです。

# Custom Settings font.family : sans-serif xtick.direction : in ytick.direction : in xtick.major.width : 2.0 ytick.major.width : 2.0 font.size : 16 axes.linewidth : 2.0 figure.figsize : 6.0, 6.0 figure.autolayout : True savefig.transparent: True savefig.dpi : 300

このように matplotlibrc に書いておくと、import matplotlib.pyplot as plt した段階で記述した項目が反映されています。

python

1import matplotlib.pyplot as plt 2 3print(plt.rcParams["font.family"]) # ['sans-serif'] 4print(plt.rcParams["xtick.direction"]) # in 5print(plt.rcParams["ytick.direction"]) # in 6print(plt.rcParams["xtick.major.width"]) # 2.0 7print(plt.rcParams["ytick.major.width"]) # 2.0 8print(plt.rcParams["font.size"]) # 16.0 9print(plt.rcParams["axes.linewidth"]) # 2.0

上記記述で以下のコードを実行すると、質問と同じ図が作成できました。
設定項目にないものは設定できないので、目盛りの書式等はコードから除くことはできません。

import matplotlib.pyplot as plt plt.rcParams["font.size"] = 16 # Notebook の場合は必要 fig, ax = plt.subplots(figsize=(6, 6)) ax.xaxis.set_major_formatter(plt.FormatStrFormatter("%.3f")) ax.yaxis.set_major_formatter(plt.FormatStrFormatter("%.3f")) plt.locator_params(axis="y", nbins=6) plt.show()

イメージ説明

投稿2020/07/17 00:46

編集2020/07/18 13:38
tiitoi

総合スコア21956

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

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

loreeeee

2020/07/18 02:51

ありがとうございます。anacondaの仮想環境でmatplotlibをinstallしたのですが、<ホームディレクトリ>/.config/matplotlib の場所が見つかりません...コマンドでmatplotlibの場所を知る方法はありますでしょうか...?
tiitoi

2020/07/18 03:21 編集

デフォルトではないので、自分で作成する必要があります。 回答のリンク先のコードをコピペして実行すれば、作成されませんか?
tiitoi

2020/07/18 03:22

設定ファイルのパスは以下で確認できます。作成したあと、以下のパスを見に行けば、matplotlibrc ができているはずです import matplotlib as mpl print(mpl.get_configdir())
loreeeee

2020/07/18 11:20

使用OSがmacなのでubuntuの場合のコードを実行したところ 10行目subprocess.check_output("apt-get update".split()) でapt-getが使えないというエラーがでてしまいました。ここを書き換える必要はありますか?
tiitoi

2020/07/18 11:32 編集

Mac だったのですね。失礼しました。 回答に追記したコードでおそらく設定ファイルを置くディレクトリの作成と matplotlibrc のコピーができると思います。もしできなかったら教えて下さい
loreeeee

2020/07/18 12:54

追記していただいたコードを実行し、<ホームディレクトリ>/.config/matplotlib/matplotlibrc を開き、 ``` import matplotlib.pyplot as plt plt.rcParams['font.family'] ='sans-serif'#使用するフォント plt.rcParams['xtick.direction'] = 'in'#x軸の目盛線が内向き('in')か外向き('out')か双方向か('inout') plt.rcParams['ytick.direction'] = 'in'#y軸の目盛線が内向き('in')か外向き('out')か双方向か('inout') plt.rcParams['xtick.major.width'] = 2.0#x軸主目盛り線の線幅 plt.rcParams['ytick.major.width'] = 2.0#y軸主目盛り線の線幅 plt.rcParams['font.size'] = 16 #フォントの大きさ plt.rcParams['axes.linewidth'] = 2.0# 軸の線幅edge linewidth。囲みの太さ plt.figure(figsize=(6,6)) plt.gca().xaxis.set_major_formatter(plt.FormatStrFormatter('%.3f'))#y軸小数点以下3桁表示 plt.gca().yaxis.set_major_formatter(plt.FormatStrFormatter('%.3f'))#y軸小数点以下3桁表示 plt.locator_params(axis='y',nbins=6)#y軸,6個以内. plt.gca().yaxis.set_tick_params(which='both', direction='in',bottom=True, top=True, left=True, right=True) ``` と追記したのち、コマンドラインで ``` import matplotlib.pyplot as plt ``` としたところ ``` Intel MKL FATAL ERROR: Cannot load libmkl_intel_thread.dylib. ``` というエラーが表示されました。このエラーは何が原因なのでしょうか...?
tiitoi

2020/07/18 13:35

追記しました。matplotlibrc は matplotlib の設定ファイルを記述するファイルです。 Python スクリプトをベタっと貼るのではなく、そのファイルにコメントアウトされている説明を参考に、説明したい項目だけコメントアウトを外して値を設定する使い方をします。 以下が公式ドキュメントの説明です。 https://matplotlib.org/1.5.0/users/customizing.html
loreeeee

2020/07/19 01:20

<ホームディレクトリ>/.config/matplotlib/にmatplotlibrcがなくなっており、代わりに.matplotlibrc.swpが存在していました。もう一度matplotlibrcを作成するために、 ``` import shutil from pathlib import Path import matplotlib as mpl # 設定ファイルをコピーする。 config_dir = Path(mpl.get_configdir()) config_dir.mkdir(exist_ok=True, parents=True) default_config_path = Path(mpl.__file__).parent / "mpl-data/matplotlibrc" config_path = config_dir / "matplotlibrc" print(f"設定ファイルの場所 {config_path}") shutil.copyfile(default_config_path, config_path) ``` を実行したのですが、 Intel MKL FATAL ERROR: Cannot load libmkl_intel_thread.dylib. というエラーが表示されスクリプトが実行できませんでした。 そこで <ホームディレクトリ>/.config/matplotlib/.matplotlibrc.swpをrmしてもう一度上記スクリプトを実行したところ Intel MKL FATAL ERROR: Cannot load libmkl_intel_thread.dylib. というエラーが表示されてしまいます。 また、pyhonを起動し、 import matplotlib と入力しても同様のエラーが表示されます...どうしたらよいでしょうか?
tiitoi

2020/07/19 01:32 編集

> Intel MKL FATAL ERROR: Cannot load libmkl_intel_thread.dylib. 直近で設定ファイルを弄る以外になにかライブラリをインストールまたはアップデートしたりしましたか?設定ファイルの書式が間違っていれば、import した際に `Illegal line ` のエラーは出ますが、上記エラーが出るというのは不可解です。 ---- とりあえず以下の順に試してはどうでしょうか。 1. matplotlib ディレクトリごと全部削除して直るか確認する それでも駄目なら 2. matplotlib を再インストールする conda uninstall matplotlib conda install -c conda-forge matplotlib
loreeeee

2020/07/19 01:44 編集

直近で仮想環境(py37)にconda install mysqlをインストールしておりました。 ちなみにbaseの環境でmatplotlibをimportすると何もエラーが出ませんでした。 (conda activate py37としたのちにmatplotlibをインポートすると Intel MKL FATAL ERROR: Cannot load libmkl_intel_thread.dylib. というエラーが表示されます。) >1. matplotlib ディレクトリごと全部削除して直るか確認する についてですが baseの環境でimport matplotlibとしてmpl.get_configdir())とすると  <ホームディレクトリ>/.matplotlibが表示されました。  この.matplotlibをrmするという理解でよろしいですか?
tiitoi

2020/07/19 01:48

それを削除してください Mac の場合は、/Users/<user-name>/.matplotlib/ なのですね。Linux 環境だと ~/.config/matplotlib/ だったので勘違いしてました。
loreeeee

2020/07/19 01:54

1.を実行しましたが同様のMKL FATAL ERRORが表示されたままでした。 2. を実行しようと思うのですが、仮想環境下でconda uninstall matplotlibとしたらよいでしょうか?
tiitoi

2020/07/19 02:00 編集

> 2. を実行しようと思うのですが、仮想環境下でconda uninstall matplotlibとしたらよいでしょうか? それでよいです。 対象の環境下でアンイストール後に再インストールです。 それでも駄目なら 3. 仮想環境を作り直す のがよいと思います。 ---- ちなみに MKL FATAL ERROR はおそらく、numpy の import で発生しています。(matplotlib 内部で numpy を使用している) なので、numpy がおそらく import できなくなっているのではないかと思います。matplotlibrc の設定ファイル変更の影響でそうなるとは考えづらく、他のライブラリのインストール等で環境が壊れた可能性があります。numpy の再インストールも試みるといいかもしれないです。
loreeeee

2020/07/19 02:08

ありがとうございます。仮想環境で conda uninstall matplotlib conda install -c conda-forge matplotlib としましたが同様のエラーが表示れました(ご指摘の通りnumpyのimportでも同様のエラーでした) 思い当たる節としては仮想環境にmysqlをconda installした際に、ネットワークが不安定で何回かinstallの途中で失敗し繰り返しinstallをしたことが原因かと思ってます. まずは仮想環境をもう一度作り直します。
loreeeee

2020/07/19 02:25

仮想環境を作り直しました。 最初に書かれていた以下のコード ``` import shutil from pathlib import Path import matplotlib as mpl # 設定ファイルをコピーする。 config_dir = Path(mpl.get_configdir()) config_dir.mkdir(exist_ok=True, parents=True) default_config_path = Path(mpl.__file__).parent / "mpl-data/matplotlibrc" config_path = config_dir / "matplotlibrc" print(f"設定ファイルの場所 {config_path}") shutil.copyfile(default_config_path, config_path) ``` を実行する際は、仮想環境で行ったほうがよいでしょうか? ちなみに仮想環境下でもbase環境下でもmatplotlibの設定ファイルはUsers/<user-name>/.matplotlib/ を指しているのですが、設定ファイルは仮想環境とbase環境で共有しているのでしょうか?
tiitoi

2020/07/19 02:36

設定ファイルは共有しているので、どこで実行しても同じだと思います。
loreeeee

2020/07/19 02:48

上記手順でmatplotlibrcの設定ファイルを書き換え、同じ図が出力されることを確認できました。 質問と関連のないエラーの問題までご対応していただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問