본문 바로가기

Programing

Python matplotlib 다중 막대

반응형

Python matplotlib 다중 막대


matplotlib에서 여러 막대를 그리는 방법은 bar 함수를 여러 번 호출하려고 할 때 겹쳐지며 아래 그림에서 볼 수 있듯이 가장 높은 값인 빨간색 만 볼 수 있습니다. x 축에 날짜가있는 여러 막대를 어떻게 플로팅 할 수 있습니까?

지금까지 이것을 시도했습니다.

import matplotlib.pyplot as plt
import datetime

x = [
    datetime.datetime(2011, 1, 4, 0, 0),
    datetime.datetime(2011, 1, 5, 0, 0),
    datetime.datetime(2011, 1, 6, 0, 0)
]
y = [4, 9, 2]
z = [1, 2, 3]
k = [11, 12, 13]

ax = plt.subplot(111)
ax.bar(x, y, width=0.5, color='b', align='center')
ax.bar(x, z, width=0.5, color='g', align='center')
ax.bar(x, k, width=0.5, color='r', align='center')
ax.xaxis_date()

plt.show()

알 겠어:

여기에 이미지 설명 입력

결과는 다음과 같아야하지만 날짜가 x 축에 있고 막대가 서로 옆에 있습니다.

여기에 이미지 설명 입력


import matplotlib.pyplot as plt
from matplotlib.dates import date2num
import datetime

x = [
    datetime.datetime(2011, 1, 4, 0, 0),
    datetime.datetime(2011, 1, 5, 0, 0),
    datetime.datetime(2011, 1, 6, 0, 0)
]
x = date2num(x)

y = [4, 9, 2]
z = [1, 2, 3]
k = [11, 12, 13]

ax = plt.subplot(111)
ax.bar(x-0.2, y, width=0.2, color='b', align='center')
ax.bar(x, z, width=0.2, color='g', align='center')
ax.bar(x+0.2, k, width=0.2, color='r', align='center')
ax.xaxis_date()

plt.show()

여기에 이미지 설명 입력

"y 값도 겹칩니다"가 무엇을 의미하는지 모르겠습니다. 다음 코드가 문제를 해결합니까?

ax = plt.subplot(111)
w = 0.3
ax.bar(x-w, y, width=w, color='b', align='center')
ax.bar(x, z, width=w, color='g', align='center')
ax.bar(x+w, k, width=w, color='r', align='center')
ax.xaxis_date()
ax.autoscale(tight=True)

plt.show()

여기에 이미지 설명 입력


날짜를 x 값으로 사용하는 데 문제가있는 것은 두 번째 그림과 같은 막대 차트를 원하면 잘못된 것입니다. 누적 막대 차트 (상호 색상)를 사용하거나 날짜별로 그룹화 (기본적으로 데이터 포인트를 그룹화하는 x 축의 "가짜"날짜)를 사용해야합니다.

import numpy as np
import matplotlib.pyplot as plt

N = 3
ind = np.arange(N)  # the x locations for the groups
width = 0.27       # the width of the bars

fig = plt.figure()
ax = fig.add_subplot(111)

yvals = [4, 9, 2]
rects1 = ax.bar(ind, yvals, width, color='r')
zvals = [1,2,3]
rects2 = ax.bar(ind+width, zvals, width, color='g')
kvals = [11,12,13]
rects3 = ax.bar(ind+width*2, kvals, width, color='b')

ax.set_ylabel('Scores')
ax.set_xticks(ind+width)
ax.set_xticklabels( ('2011-Jan-4', '2011-Jan-5', '2011-Jan-6') )
ax.legend( (rects1[0], rects2[0], rects3[0]), ('y', 'z', 'k') )

def autolabel(rects):
    for rect in rects:
        h = rect.get_height()
        ax.text(rect.get_x()+rect.get_width()/2., 1.05*h, '%d'%int(h),
                ha='center', va='bottom')

autolabel(rects1)
autolabel(rects2)
autolabel(rects3)

plt.show()

여기에 이미지 설명 입력


나는이에 대한 것을 알고 matplotlib있지만 사용 pandas하고 seaborn당신에게 많은 시간을 절약 할 수 있습니다 :

df = pd.DataFrame(zip(x*3, ["y"]*3+["z"]*3+["k"]*3, y+z+k), columns=["time", "kind", "data"])
plt.figure(figsize=(10, 6))
sns.barplot(x="time", hue="kind", y="data", data=df)
plt.show()

여기에 이미지 설명 입력


이 솔루션을 사용했습니다. 한 그림에 둘 이상의 플롯을 그리려면 다음 플롯을 그리기 전에 matplotlib.pyplot.hold(True)다른 플롯을 추가 할 수 있도록 설정했는지 확인하십시오 .

X 축의 날짜 시간 값에 대해서는 막대 정렬을 사용하는 솔루션이 적합합니다. 를 사용하여 다른 막대 그림을 만들 때는을 matplotlib.pyplot.bar()사용 align='edge|center'하고 설정 하기 만하면 됩니다 width='+|-distance'.

모든 막대 (플롯)를 올바르게 설정하면 막대가 잘 표시됩니다.

참조 URL : https://stackoverflow.com/questions/14270391/python-matplotlib-multiple-bars

반응형