0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

matplotlibでグラフを重ねて表示することに苦労した話

Posted at

##背景
matplotlibでデータを可視化していたら、棒グラフを折れ線グラフを重ねて表示できないのかと思った。(異なる種類のグラフはそれぞれ別のグラフに出すのをよく見るので)
簡単にできると思っていたら苦労したので、可視化できるまでに必要だった知識をまとめる

最終的作成したコードとグラフ

#Importing required packages.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.linear_model import SGDClassifier
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score
%matplotlib inline

#Loading dataset
train_df = pd.read_csv('./input/train.csv')
test_df = pd.read_csv('./input/test.csv')

#plot用のsort済みデータを作成
line_df = train_df.sort_values(by=["quality","fixed acidity"])

fig = plt.figure(figsize = (20,10))
ax = fig.add_subplot(1,1,1) # Axesを作成
line1= ax.bar('quality', 'fixed acidity', data = train_df, label='1st plot',alpha=0.5,color='y') # Axes.linesにLine2Dを追加
line2 = ax.plot('quality', 'fixed acidity', data = line_df, label='2nd plot') # Axes.linesにLine2Dを追加
ax.legend()
ax.set_xlabel('x value')
ax.set_ylabel('y value')
```
出力結果
![スクリーンショット 2020-01-18 23.39.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223898/aa9f62d3-aae1-72b6-f77e-523c0903c1b9.png)


##matplotlibの構造の知識
今までplt.plot()のカッコ内にデータ突っ込むくらいしか知識が無かったが他にオブジェクト思考的にグラフの部品部品を作成していくようなイメージの作り方があった
イメージはグラフを作成する土台figureを作成しその上にグラフをかく板axes)、その上に軸たちAxisを作成していくというもの
で作り終わった後にグラフをかく板axesにあるグラフを表示する機能axes.plotなどを使って描写できる
こっちのオブジェクト指向的な方が各パーツをイメージしながら作成できるので細かい部分を調整する場合は良いらしい
[詳しくはこちら](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)
##matplotlib.axes.Axes.plotの罠
axes.plot()で2箇所ほどつまづいた

<b>1点目</b>
最初はx = ,y = のような感じでデータを直接指定したがエラーが出た
原因は今回dataframeオブジェクトを渡したのでオプションにはデータのカラム名のみ記入する必要があった
下がmatplotlib.axes.Axes.plotのドキュメント
>
There's a convenient way for plotting objects with labelled data (i.e. data that can be accessed by index obj['y']). Instead of giving the data in x and y, you can provide the object in the data parameter and just give the labels for x and y:
>>> plot('xlabel', 'ylabel', data=obj)

[matplotlib.axes.Axes.plotのドキュメント]
(https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.plot.html)

下が解決したコード部分

```python
line2 = ax.plot('quality', 'fixed acidity', data = line_df, label='2nd plot')
```

<b>2点目</b>
axes.plot()で折れ線グラフを作ったがこれはarray配列の最初からプロットされた点をただ結んでいくので、順番を揃えないとぐちゃぐちゃなグラフが出来上がった。(下図はイメージ)
![スクリーンショット 2020-01-18 23.51.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223898/7cc341e0-88d6-52ef-f4e5-95185664b9c1.png)

X軸とY軸で順番をsortしたdataframeを新しく作成することで解決

```python
line_df = train_df.sort_values(by=["quality","fixed acidity"])
```
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?