Python
 Computer >> コンピューター >  >> プログラミング >> Python

Matplotlibでラベルをぼかさずにプロットを美しくラスタライズする方法

Matplotlibで図を保存する際、大量のデータポイントを含む塗りつぶし領域などをベクター形式のまま出力すると、ファイルサイズが肥大化してしまうことがあります。そこで便利なのがrasterized=Trueによるラスタライズですが、alphaパラメータとの組み合わせ方によっては、ラベル(テキスト)の見え方が大きく変わってしまいます。この記事では、4つのサブプロットを使って両者の組み合わせを比較しながら、ラベルの視認性を保ちながらプロットをラスタライズする方法を解説します。

実装の手順

  • 図のサイズを設定し、サブプロット間および周囲のパディングを自動調整できるようにします。
  • Figureと4つのサブプロットを作成します。
  • 軸0:fill_between()で領域を塗りつぶします。alpha=0.2を指定し、rasterized=False(ベクターのまま)とします。
  • 軸1:同様にalpha=0.2を指定して塗りつぶしますが、こちらはrasterized=True(ラスタライズ)とします。
  • 軸2・軸3:alphaを指定せずに塗りつぶし、それぞれrasterized=Truerasterized=Falseを設定します。
  • 各軸にテキストラベルを追加します(すべてrasterized=Trueを指定)。
  • plt.show()で図を表示します。

コード例

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True

fig, axes = plt.subplots(nrows=4, sharex=True)

axes[0].fill_between(np.arange(1, 10), 1, 2, zorder=-1, alpha=0.2, rasterized=False)
axes[0].text(5, 1.5, "Label 1", ha='center', va='center', fontsize=25, zorder=-2, rasterized=True)

axes[1].fill_between(np.arange(1, 10), 1, 2, zorder=-1, alpha=0.2, rasterized=True)
axes[1].text(5, 1.5, "Label 2", ha='center', va='center', fontsize=25, zorder=-2, rasterized=True)

axes[2].fill_between(np.arange(1, 10), 1, 2, zorder=-1, rasterized=True)
axes[2].text(5, 1.5, "Label 3", ha='center', va='center', fontsize=25, zorder=-2, rasterized=True)

axes[3].fill_between(np.arange(1, 10), 1, 2, zorder=-1, rasterized=False)
axes[3].text(5, 1.5, "Label 4", ha='center', va='center', fontsize=25, zorder=-2, rasterized=True)

plt.show()

出力結果

上記のコードを実行すると、次のような図が出力されます。

Matplotlibでラベルをぼかさずにプロットを美しくラスタライズする方法

ここで注目すべきは軸2と軸3です。この2つの軸では塗りつぶしにalphaを指定していないため、塗りつぶしが完全に不透明になり、zorderが低く設定されているラベルが隠れて見えなくなっています。一方、alpha=0.2を指定した軸0と軸1では、半透明の塗りつぶし越しにラベルが透けて表示されます。

補足:ラスタライズ時の画質を保つポイント

  • rasterized=Trueを指定した要素は、保存時にビットマップとして描画されます。その解像度はsavefig()dpi設定に依存するため、plt.savefig("output.png", dpi=300)のようにdpiを上げると、ラスタライズ部分もより鮮明になります。
  • テキストや線にrasterized=Trueを指定しなければ、それらはベクター形式のまま出力されるため、拡大してもぼやけません。
  • 「面積の大きな塗りつぶしだけラスタライズし、ラベルや線はベクターのまま残す」という使い分けが、ファイルサイズと画質を両立させる基本の考え方です。
  1. MatplotlibのヒストグラムでX軸ラベルを各ビンの中央に配置する方法

    Matplotlibのヒストグラムプロットでは、デフォルトのままではX軸の目盛りラベルがビン(階級)の境界線上に表示されます。これを各バー(パッチ)の中央に配置するには、各パッチの中間点を計算し、xticks()メソッドを使って目盛りラベルを適切な位置に設定します。手順図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。NumPyを使って、標準正規分布に従うランダムなサンプルデータxを作成します。ビン(階級)の数を格納する変数を初期化します。hist()メソッドを使用してヒストグラムを描画します。戻り値として得られるpatchesから、各バーの中央位置(_x0と_x1

  2. Matplotlibでサブプロットの目盛りラベルの密度を下げる方法

    Matplotlibでグラフを描画する際、目盛りラベルが多すぎると表示が混雑して読みにくくなることがあります。この問題を解決するには、density(密度)変数に小さな値を設定することで、目盛りラベルの密度を下げることができます。手順目盛りの間隔を制御するための変数 density を初期化します。NumPyを使用して x および y のデータポイントを作成します。plot() メソッドを使って x と y のデータポイントをプロットします。xticks() メソッドを使用して、X軸の目盛り位置とラベルを設定します。show() メソッドで図を表示します。コード例import numpy as