0
0

[fill_between(x, y1, y2)] 平均値とy軸で幅を出した結果のプロットをしたいのにうまくいかない

Posted at

問題

グラフの表現が一次関数的にならない

下記のグラフ(ぐちゃぐちゃすぎて)すごくないですか?
image.png

こちらは、下記をやろうとしたものです。 

本当なら一次関数的に一本の線がしゅっとでてくれるのを期待していたのですがうまくいきませんでした。
具体的には、x軸を月日、y軸をとある

# make data for depth - fill between plot
np.random.seed(1)
x = file[' date']
y1 = file['maximum'].astype(float)  # 数値に変換
y2 = file['minimum'].astype(float)  # 数値に変換

# plot
fig, ax = plt.subplots()
# ★プロットのサイズ調整


ax.fill_between(x, y1, y2, alpha=.5, linewidth=0) #label='Between Top and Bottom Filtering')
ax.plot(x, (y1 + y2) / 2, linewidth=2) # label='Average of xxxx')

ax.set(xlabel='Sampling date', ylabel='Values', title='Fill Between Example')
plt.show()

あり得る原因1: 読み込みデータのy1とy2の絶対値的な差が異なる

y1のほうが基本的にy2より大きい値のデータだけどたまに逆もあり得る
解決方法としては、データをきれいにする。

あり得る原因2: x軸が月日のデータになっていて暴れてる

何故暴れるかはわからないのですが、月日のデータを数値にしてあげるといい感じです。

具体的な解決方法としては

x = np.arange(len(file))  # 数字の配列に変換 

x = np.arange(len(file)) # 数字の配列に変換
はなにをしていますかというと

x = np.arange(len(file)) は、file データフレームの行数(データの個数)に基づいて、0から始まる連続した整数の配列を生成しています。これにより、データの順序に応じて一連の整数が x 軸に対応します。

この整数列は、file データフレームの行数分の数値で構成され、例えば、0, 1, 2, 3, ... というようにデータの先頭から順に割り当てられます。このような数値の配列を用意することで、matplotlib などのプロットライブラリでグラフを描く際に、x 軸にこの整数列を指定することができます。

あり得る原因3:タイムシリーズ(時系列データ)の場合、一日に2つ以上のサンプルがあってブルってる

これ一番可能性高いのでは。そもそも線で結ぶことに向いてないということですね、データが

解決方法

Groupbyを使ってコードを修正する

Or
線グラフではなくてスキャッターにする(これが一番簡単)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0