2013-01-11 29 views
28

Làm thế nào để vẽ nhiều thanh trong matplotlib, khi tôi cố gắng gọi chức năng thanh nhiều lần, chúng chồng lên nhau và như hình dưới đây, giá trị màu đỏ cao nhất chỉ có thể được nhìn thấy. Làm thế nào tôi có thể vẽ nhiều thanh với các ngày trên trục x?python matplotlib nhiều vạch

Cho đến nay, tôi đã cố gắng này:

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)![enter image description here][1] 
    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() 

Tôi nhận điều này: enter image description here

Các kết quả sẽ được một cái gì đó như thế nào, nhưng với những ngày đang ở trên trục x và quán bar cạnh nhau khác: enter image description here

+0

bạn cần thay đổi các giá trị x – jterrace

+0

Ý anh là gì? Giá trị X là ngày ... –

Trả lời

38
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() 

enter image description here

Tôi không biết những gì là "giá trị y cũng được chồng chéo" có nghĩa là, không đoạn mã sau giải quyết vấn đề của bạn?

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() 

enter image description here

+0

Cảm ơn, nhưng nếu tôi có 3 thanh, có vẻ tốt. Khi tôi cố gắng như 40 quán bar, nó lộn xộn. Bạn có thể vui lòng cập nhật giải pháp của mình để có thể mở rộng hơn không? –

+0

Xác định "messes up"?Các nhãn X chồng chéo có thể được cố định bằng cách sử dụng 'autofmt_xdate()', tự động xoay nhãn. – jozzas

+0

Vấn đề không trùng lặp với các nhãn X, điều là các giá trị y cũng trùng lặp. Làm thế nào để sửa chữa nó? –

17

Sự cố khi sử dụng ngày làm giá trị x, là nếu bạn muốn biểu đồ thanh như trong ảnh thứ hai của bạn, chúng sẽ sai. Bạn nên sử dụng biểu đồ thanh xếp chồng lên nhau (màu trên đầu trang của nhau) hoặc nhóm theo ngày (ngày "giả" trên trục x, về cơ bản chỉ nhóm các điểm dữ liệu).

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() 

enter image description here

+0

nếu tôi muốn hiển thị như 100 ngày trên trục x, bạn phù hợp với chúng như thế nào? –

+0

Bạn có thể dễ dàng tạo ngày bắt buộc với 'datetime64' của numpy: ví dụ: Giá trị một tháng: 'np.arange ('2012-02', '2012-03', dtype = 'datetime64 [D]')'. Bạn có thể cần phải suy nghĩ kỹ hơn về cách tốt nhất để thể hiện dữ liệu này nếu bạn có 40 bộ dữ liệu (theo một nhận xét khác) kéo dài hơn 100 ngày. – jozzas

+0

bạn có thể cập nhật mã của mình bằng giải pháp được đề xuất không? –

0

Hoặc bạn có thể sử dụng một cấu trúc dữ liệu 2D và để matplotlib xử lý khoảng cách cột của bạn:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.random.randn(1000, 3) 
bins = np.arange(-4.5, 4.5, 1) 
colors = ['red', 'tan', 'lime'] 

plt.hist(x, bins=bins, color=colors, label=colors) 
plt.legend() 
plt.xticks(bins + 0.5, ['bin ' + str(int(x)) for x in (bins + 0.5)]) 
plt.show() 

Thêm rwidth = 1 sẽ loại bỏ bất kỳ khoảng trống giữa các thanh.

enter image description here

Source

Các vấn đề liên quan