5

サブプロット内で Pandas boxplot を描画する際に問題が発生しています。私が試みている2つの方法に基づいて、ボックスプロットを作成すると、すでに作成したすべてのサブプロットが削除されるか、サブプロットグリッドの後にボックスプロットがプロットされます。しかし、サブプロットグリッド内に描画できないようです。

import matplotlib.pyplot as plt
import pandas
from pandas import DataFrame, Series

data = {'day' : Series([1, 1, 1, 2, 2, 2, 3, 3, 3]), 
        'val' : Series([3, 4, 5, 6, 7, 8, 9, 10, 11])}
df = pandas.DataFrame(data)

私が最初に試したことは次のとおりです。

plt.figure()

plt.subplot(2, 2, 1)
plt.plot([1, 2, 3])

plt.subplot(2, 2, 4)
df.boxplot('val', 'day')

しかし、これは単にサブプロットの外側にプロットを作成します:

試行A ここに画像の説明を入力

それで、私は手で軸を供給しようとしました:

plt.figure()

plt.subplot(2, 2, 1)
plt.plot([1, 2, 3])

plt.subplot(2, 2, 4)
ax = plt.gca()
df.boxplot('val', 'day', ax=ax)

しかし、これは最初の画像だけでなく、サブプロット グリッドをまとめて破壊するだけです。

ここに画像の説明を入力

ボックスプロット画像をサブプロットの右下のグリッド (最初の画像セットで空のもの) に表示する方法はありますか?

4

1 に答える 1

6

これは、パンダのプロット設定におけるバグ、または少なくとも望ましくない動作のようです。にby引数を指定するとboxplot、pandas が独自のsubplots呼び出しを発行し、既存のサブプロットが消去されます。複数の値をプロットしたい場合、各値のサブプロットを作成するように、明らかにこれを行います (たとえば、Y1 を日ごとに 1 つの箱ひげ図、Y2 を日ごとに別の箱ひげ図など)。

ただし、実行する必要があるように見えますが、実行しないのは、1 つの値のみをプロットしているかどうかを確認することです。その場合は、ax独自のサブプロットを作成する代わりに、提供されたオブジェクト (存在する場合) を使用します。1 つの値のみをプロットすると、1 行 1 列のサブプロット グリッドが作成されますが、これはあまり役に立ちません。プロットしている列の数 (最初の引数の長さ) に基づいてグリッドを作成するため、そのロジックも少し奇妙ですが、これは引数を指定した場合にのみ行われbyます。のようなマルチボックス プロットを許可することを意図しているようdf.boxplot(['col1', 'col2'])ですが、そうすることで、かなり合理的なdf.boxplot('col1', 'grouper1').

pandas bug trackerで問題を提起することをお勧めします。

それまでの間、ややハック的な回避策はこれを行うことです:

df.pivot('val', 'day', 'val').boxplot(ax=ax)

これにより、group-by 値 (日) が列になるようにデータが再形成されます。再形成されたテーブルにはval、特定の値で発生しない値の多くの NA がありますdayが、これらの NA はプロット時に無視されるため、正しいサブプロット位置に正しいプロットが得られます。

于 2013-05-11T19:03:29.997 に答える