2011-10-07 11 views
19

मैं एक डेटा नमूना जो इस तरह दिखता है साजिश:matplotlib/gnuplot में लेबल अंतराल

a 10:15:22 10:15:30 OK 
b 10:15:23 10:15:28 OK 
c 10:16:00 10:17:10 FAILED 
b 10:16:30 10:16:50 OK 

क्या मैं चाहता हूँ निम्नलिखित तरीके से ऊपर डेटा प्लॉट के लिए है:

captions^
    | 
c |   *------* 
b | *---* *--* 
a | *--* 
    |___________________ 
        time > 
साथ

डेटा बिंदु की OK/FAILED स्थिति के आधार पर रेखाओं का रंग। लेबल (a/b/c/...) दोहराना या नहीं हो सकता है।

मैं gnuplot और matplotlib के लिए दस्तावेज़ से इकट्ठा किया है, एक साजिश के इस प्रकार बाद में करने के लिए के रूप में यह एक मानक साजिश नहीं है आसान होना चाहिए और कुछ पूर्व प्रसंस्करण की आवश्यकता होगी।

सवाल यह है:

  1. वहाँ उपकरण में से किसी में इस तरह भूखंडों करने के लिए एक मानक तरीका है?
  2. यदि नहीं, तो मुझे इस डेटा को साजिश करने के बारे में कैसे जाना चाहिए (प्रासंगिक उपकरण/दस्तावेज़ीकरण/कार्यों/उदाहरणों के लिए पॉइंटर्स जो कुछ बताते हैं-जैसा कि यहां वर्णित चीज है)?

उत्तर

21

अपडेटेडः अब डेटा नमूना को संभालने और एमपीएल तिथियों की कार्यक्षमता का उपयोग करने में शामिल है।

import matplotlib.pyplot as plt 
from matplotlib.dates import DateFormatter, MinuteLocator, SecondLocator 
import numpy as np 
from StringIO import StringIO 
import datetime as dt 

### The example data 
a=StringIO("""a 10:15:22 10:15:30 OK 
b 10:15:23 10:15:28 OK 
c 10:16:00 10:17:10 FAILED 
b 10:16:30 10:16:50 OK 
""") 

#Converts str into a datetime object. 
conv = lambda s: dt.datetime.strptime(s, '%H:%M:%S') 

#Use numpy to read the data in. 
data = np.genfromtxt(a, converters={1: conv, 2: conv}, 
        names=['caption', 'start', 'stop', 'state'], dtype=None) 
cap, start, stop = data['caption'], data['start'], data['stop'] 

#Check the status, because we paint all lines with the same color 
#together 
is_ok = (data['state'] == 'OK') 
not_ok = np.logical_not(is_ok) 

#Get unique captions and there indices and the inverse mapping 
captions, unique_idx, caption_inv = np.unique(cap, 1, 1) 

#Build y values from the number of unique captions. 
y = (caption_inv + 1)/float(len(captions) + 1) 

#Plot function 
def timelines(y, xstart, xstop, color='b'): 
    """Plot timelines at y from xstart to xstop with given color.""" 
    plt.hlines(y, xstart, xstop, color, lw=4) 
    plt.vlines(xstart, y+0.03, y-0.03, color, lw=2) 
    plt.vlines(xstop, y+0.03, y-0.03, color, lw=2) 

#Plot ok tl black  
timelines(y[is_ok], start[is_ok], stop[is_ok], 'k') 
#Plot fail tl red 
timelines(y[not_ok], start[not_ok], stop[not_ok], 'r') 

#Setup the plot 
ax = plt.gca() 
ax.xaxis_date() 
myFmt = DateFormatter('%H:%M:%S') 
ax.xaxis.set_major_formatter(myFmt) 
ax.xaxis.set_major_locator(SecondLocator(interval=20)) # used to be SecondLocator(0, interval=20) 

#To adjust the xlimits a timedelta is needed. 
delta = (stop.max() - start.min())/10 

plt.yticks(y[unique_idx], captions) 
plt.ylim(0,1) 
plt.xlim(start.min()-delta, stop.max()+delta) 
plt.xlabel('Time') 
plt.show() 

Resulting image

+0

धन्यवाद। मैंने आधार के रूप में आपके समाधान का उपयोग करके ग्राफ को सफलतापूर्वक खींचा है। यदि कोई बेहतर समाधान का प्रस्ताव नहीं देता है तो आपका जवाब स्वीकार करेगा। – dm3

+0

मैंने अपना जवाब अपडेट किया, मैं हमेशा matplotlibs दिनांक कार्यक्षमता सीखना चाहता था। – tillsten

+1

विभिन्न अंत प्रतीकों के लिए आप तितर-बितर प्रतीकों के साथ vlines को प्रतिस्थापित करते हैं। plt.scatter (xstart, y, s = 100, c = color, marker = 'x', lw = 2, edgecolor = color) – tillsten