2010-02-03 4 views
11

इस 3D bar graph sample code को देखते हुए, आप x-axis में संख्यात्मक डेटा को स्वरूपित दिनांक/समय तारों में कैसे परिवर्तित करेंगे? मैंने सफलता के बिना ax.xaxis_date() फ़ंक्शन का उपयोग करने का प्रयास किया है। मैंने plot_date() का उपयोग करने का भी प्रयास किया, जो 3 डी बार ग्राफ के लिए काम नहीं करता है। यहाँ नमूना कोड का एक संशोधित संस्करण को वर्णन करने के है कि मैं क्या करने की कोशिश कर रहा हूँ:Matplotlib: 3 डी बार ग्राफ़ में एक्स-अक्ष पर स्वरूपण दिनांक

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.dates as dates 

dates = [dates.date2num(datetime.datetime(2009,3,12)), 
     dates.date2num(datetime.datetime(2009,6,9)), 
     dates.date2num(datetime.datetime(2010,1,1)), 
     #etc... 
     ] 

fig = plt.figure() 
ax = Axes3D(fig) 
for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): 
    xs = np.array(dates) 
    ys = np.random.rand(20) 
    ax.bar(xs, ys, zs=z, zdir='y', color=c, alpha=0.8) 

ax.set_xlabel('Date & Time') 
ax.set_ylabel('Series') 
ax.set_zlabel('Amount') 

plt.show() 

alt text http://matplotlib.sourceforge.net/_images/bars3d_demo1.png

+0

मैं सिर्फ अपने कोड की कोशिश की और मैं नहीं बल्कि अच्छी तरह से मेरी सेट अप पर (तारीखों के साथ एक्स मूल्यों मैच) साजिश रची। मैं पायथन 2.6.4 और नवीनतम matplotlib (संस्करण 0.9 9 .1) का उपयोग कर रहा हूँ। क्या आपको अपने पायथन पैकेज को अपडेट करने की आवश्यकता है? –

+0

क्या आप सिर्फ xticks संख्याओं के बजाय स्ट्रिंग होना चाहते हैं? – Mark

+0

हां, या सभी स्ट्रिंग्स को पहले से उत्पन्न करने के बजाय गतिशील रूप से टिक को प्रारूपित करने के लिए फ़ंक्शन नाम पास करने का विकल्प। – pokstad

उत्तर

12

वहाँ कुछ भ्रम की स्थिति यहाँ हो सकता है, Axes3D गुण w_xaxis है, w_yaxis और axises के लिए w_zaxis सामान्य xaxix, yaxis, आदि के बजाय ..

अद्यतन अब लेबल स्वरूपित करने के लिए फ़ंक्शन का उपयोग करता है।

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.dates as dates 
import datetime, random 
import matplotlib.ticker as ticker 

def random_date(): 
     date = datetime.date(2008, 12,01) 
     while 1: 
     date += datetime.timedelta(days=30) 
     yield (date) 

def format_date(x, pos=None): 
    return dates.num2date(x).strftime('%Y-%m-%d') #use FuncFormatter to format dates 

r_d = random_date() 
some_dates = [dates.date2num(r_d.next()) for i in range(0,20)] 

fig = plt.figure() 
ax = Axes3D(fig,rect=[0,0.1,1,1]) #make room for date labels 

for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): 
    xs = np.array(some_dates) 
    ys = np.random.rand(20) 
    ax.bar(xs, ys, zs=z, zdir='y', color=c, alpha=0.8,width=8) 

ax.w_xaxis.set_major_locator(ticker.FixedLocator(some_dates)) # I want all the dates on my xaxis 
ax.w_xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) 
for tl in ax.w_xaxis.get_ticklabels(): # re-create what autofmt_xdate but with w_xaxis 
     tl.set_ha('right') 
     tl.set_rotation(30)  

ax.set_ylabel('Series') 
ax.set_zlabel('Amount') 

plt.show() 

का उत्पादन:

alt text http://www.imagechicken.com/uploads/1265570252049424000.png

+0

+1 बिल्कुल सही जवाब जिसने मेरी नौकरी को आसान बना दिया, धन्यवाद! – pokstad

+0

+1, मैं mplot3d में टिक लेबल को कस्टमाइज़ करने का एक तरीका ढूंढ रहा था। – fotNelton

संबंधित मुद्दे