Matplotlib 막대 그래프의 가로축 순서가 마음대로 바뀔 때의 대처법

Matplotlib에서 x축에 카테고리 변수, y축에 수치를 취하는 막대 그래프를 그리고 싶을 때, 그래프가 생각했던 대로의 순서로 줄지 않을 수 있습니다.

개선 전 ~ 막대 그래프가 생각대로 줄지 않는다 ~



코드


import numpy as np
import matplotlib.pyplot as plt

# 棒グラフをyの値が大きい順に並べたい
data = np.array(['much', 1.11], ['more', 2.22], ['most', 3.33])

# dataをyの降順にソート
data_sorted = data[np.argsort(data[:,1])[::-1]]

# x, yの配列を取得
x = data_sorted[:, 0]  #['most', 'more', 'much']
y = data_sorted[:, 1].astype(np.float64)  #[3.33, 2.22, 1.11]

# 棒グラフを描画する
fig = plt.figure()
ax1 = fig.add_subplot(1, 2, 1)
ax1.bar(x, y)
plt.show()

결과



배열 x, y를 y의 내림차순이 되도록 정렬한 상태에서 막대 그래프를 그렸습니다.
그러나 막대 그래프는 그렇게 줄지어 있지 않습니다.



왜?

그래프를 그릴 때 데이터가 자동으로 x의 오름차순이 되도록 정렬되어 버리기 때문에, 그래프가 more -> most -> much 와 같이 x에 관한 사전순으로 줄지어 버리는 것 같습니다.

개선 후



개선 방법 중 하나는 "x 축의 값 자체"와 "x 축의 레이블에 흔들리는 값"을 분리하는 아이디어입니다.

코드


'''
    先ほどの続き
    x = ['most', 'more', 'much']
    y = [3.33, 2.22, 1.11]
'''

# [0, 1.11], [1, 2.22], [2. 3.33] がプロットされた棒グラフのx軸に ['most', 'more', 'much'] の順でラベルを振る
x_temp = range(len(x))
ax2 = fig.add_subplot(1, 2, 2)
ax2.bar(x_temp, y, tick_label=x, color='green')

# 描画
fig.subplots_adjust(wspace=0.4)
plt.show()

결과



이번에는 목표대로 왼쪽에서 y의 내림차순이 되도록 막대 그래프를 늘어놓을 수 있었습니다.

좋은 웹페이지 즐겨찾기