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

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

ただいまの
回答率

88.91%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 187

loreeeee

score 35

前提・実現したいこと

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

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

該当のソースコード

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)

plt.tight_layout()#グラフが重ならず,設定した図のサイズ内に収まる。
plt.savefig('figname.pdf', transparent=True)
plt.savefig('figname.png', transparent=True, dpi=300)

#plt.contour(X, Y, Z, cmap='viridis') # viridisの配色で等高線を描く
plt.show()


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

実行環境 anaconda python3 (mac)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

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

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

追記

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)

追記

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 した段階で記述した項目が反映されています。

import matplotlib.pyplot as plt

print(plt.rcParams["font.family"])  # ['sans-serif']
print(plt.rcParams["xtick.direction"])  # in
print(plt.rcParams["ytick.direction"])  # in
print(plt.rcParams["xtick.major.width"])  # 2.0
print(plt.rcParams["ytick.major.width"])  # 2.0
print(plt.rcParams["font.size"])  # 16.0
print(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/19 11: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環境で共有しているのでしょうか?

    キャンセル

  • 2020/07/19 11:36

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

    キャンセル

  • 2020/07/19 11:48

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

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る