2016-04-23 9 views
-1

Ich habe folgende 2 Spaltendaten:Plotten colormap Diagramm für jeden Tag Seite an Seite

Time   PRESSURE 
2/24/2016 13:00 1011.937618 
2/24/2016 14:00 1011.721583 
2/24/2016 15:00 1011.348064 
2/24/2016 16:00 1011.30785 
2/24/2016 17:00 1011.3198 
2/24/2016 18:00 1011.403372 
2/24/2016 19:00 1011.485108 
2/24/2016 20:00 1011.270083 
2/24/2016 21:00 1010.936331 
2/24/2016 22:00 1010.920958 
2/24/2016 23:00 1010.816478 
2/25/2016 00:00 1010.899142 
2/25/2016 01:00 1010.209392 
2/25/2016 02:00 1009.700625 
2/25/2016 03:00 1009.457683 
2/25/2016 04:00 1009.268081 
2/25/2016 05:00 1009.718639 
2/25/2016 06:00 1010.745444 
2/25/2016 07:00 1011.062028 
2/25/2016 08:00 1011.168117 
2/25/2016 09:00 1010.771281 
2/25/2016 10:00 1010.138053 
2/25/2016 11:00 1009.509119 
2/25/2016 12:00 1008.703811 
2/25/2016 13:00 1008.021547 
2/25/2016 14:00 1007.774825 
    ..................... 

Und ich möchte ein Grundstück mit der X-Achse von Tagen schaffen (25.2, 26.2, .. ., 3/25) und Y-Achse der Zeit (00:00, 01:00, ..., 23:00). An jedem Tag möchte ich eine Intensitätskurve des Drucks für jede Stunde. So sollte das Ergebnisdiagramm einen Intensitätsbalken für jeden Tag nebeneinander haben. Ich habe mit Matlab versucht, eine Variable für einen Tag (2 Spalten, weil ich für eine größere Auflösung zu interpolieren bin versucht) zu erstellen:

data = 
1010.89914200000 1010.89914200000 
1010.20939200000 1010.20939200000 
1009.70062500000 1009.70062500000 
1009.45768300000 1009.45768300000 
1009.26808100000 1009.26808100000 
1009.71863900000 1009.71863900000 
1010.74544400000 1010.74544400000 
1011.06202800000 1011.06202800000 
1011.16811700000 1011.16811700000 
1010.77128100000 1010.77128100000 
1010.13805300000 1010.13805300000 
1009.50911900000 1009.50911900000 
1008.70381100000 1008.70381100000 
1008.02154700000 1008.02154700000 
1007.77482500000 1007.77482500000 
1007.69477800000 1007.69477800000 
1007.77405000000 1007.77405000000 
1008.10153900000 1008.10153900000 
1008.42932800000 1008.42932800000 
1008.61755800000 1008.61755800000 
1008.56708100000 1008.56708100000 
1008.29791700000 1008.29791700000 
1008.21371700000 1008.21371700000 
1007.63143900000 1007.63143900000 

und aufgetragen, wie folgt:

%// Define integer grid of coordinates for the above data 
[X,Y] = meshgrid(1:size(data,2), 1:size(data,1)); 

%// Define a finer grid of points 
[X2,Y2] = meshgrid(1:0.01:size(data,2), 1:0.01:size(data,1)); 

%// Interpolate the data and show the output 
outData = interp2(X, Y, data, X2, Y2, 'linear'); 
imagesc(outData); 

%// Cosmetic changes for the axes 
set(gca, 'XTick', linspace(1,size(X2,2),size(X,2))); 
set(gca, 'YTick', linspace(1,size(X2,1),size(X,1))); 
set(gca, 'XTickLabel', 1:size(X,2)); 
set(gca, 'YTickLabel', 1:size(X,1)); 

%// Add colour bar 
colorbar; 

und bekam folgende:

enter image description here

Aber ich bin auf der Suche nach einer Möglichkeit, diese für den Rest der Zeit zu tun und es nebeneinander plotten! (Hoffe jetzt ist die Frage besser)

Danke !!!

Antwort

2

Hier ist ein python Ansatz einen „Kalender Plot“ zu machen, die Verwendung von numpy, pandas und besonders matplotlib macht. Generieren

1)

Daten
import numpy as np 
import pandas as pd 

# arbitrary hourly time series data (from 11/9/2014 to 1/17/15) 
time = pd.date_range(start='20141109', end='20150117', freq='H')[:-1] 

# sinusoidal "pressure" data with minor noise added 
x = np.linspace(-2*np.pi, 2*np.pi, num=time.size) 
pressure = np.sin(x) + 100 
noise = np.random.normal(0, 0.1, pressure.size) 
noisy_pressure = pressure + noise 

2) Erstellen Array von int s entspricht Monaten. Diese wird später verwendet werden, für die Iteration über jedes Grundstück zu beschriften

# pick out months from time array using filtering with np.diff 
months = time.month[:-1][np.diff(time.month) != 0] 
months = np.append(months, time.month[-1]) 
# months = array([11, 12, 1]) corresponding to Nov, Dec, Jan 

3) Richten Sie x und y-Achsen für Grundstücke mit np.meshgrid

hours = np.unique(time.hour) # array([0,1,2,...,21,22,23]) 
X, hours_2d = np.meshgrid([0, 1], hours) 

4) Plot Kalender matplotlib.gridspec mit Achsen einzurichten und plt.pcolormesh Farbplots von Daten

import matplotlib.pyplot as plt 
from matplotlib import gridspec 
from calendar import month_name 

cols = 7 # corresponding to days of the week 
rows = 5 # int(np.ceil(31/7)), 31=max(days in a month) 
num_days = rows * cols 

for i, month in enumerate(months): 
    gs = gridspec.GridSpec(rows, cols) 
    fig = plt.figure() 
    plt.suptitle(month_name[month], size='x-large') 

    for day in range(num_days): 
     # filter pressure on a daily basis according to month and day 
     daily_pressure = noisy_pressure[(time.month==month) & (time.day==day+1)] 
     # need to tile array in order to plot it with plt.pcolormesh 
     daily_pressure_2d = np.tile(daily_pressure, (2, 1)).T 

     if daily_pressure_2d.size > 0: 
      ax = fig.add_subplot(gs[day]) 
      cmesh = ax.pcolormesh(X, hours_2d, daily_pressure_2d, 
            vmin=noisy_pressure.min(), 
            vmax=noisy_pressure.max()) 
      # remove x and y ticklabels and x tick marks 
      ax.set_xticklabels([]); ax.set_xticks([]) 
      ax.set_yticklabels([]) 
      ax.set_xlabel('{month} {day}'.format(
       month=month_name[month][:3], day=day+1)) 
      ax.set_ylim((hours.min(), hours.max())) 
     else: 
      # basically create an empty plot for days without pressure data 
      ax = fig.add_subplot(gs[day]) 
      ax.axis('off') 

    plt.tight_layout() # for nicer formatting 
    fig.subplots_adjust(top=0.9) # create room for suptitle 
    fig.subplots_adjust(right=0.85) # create room for colorbar 
    # create colorbar with customized location 
    cbar_ax = fig.add_axes([0.87, 0.05, 0.03, 0.85]) 
    fig.colorbar(cmesh, cax=cbar_ax) 

5) Bewundern Ausgang zu machen - ein ähnliches Grundstück ist für jeden Monat im Datumsbereich erstellt

enter image description here

+0

Links zu [November] (http://i.stack.imgur.com/lqaf3.png) und [Januar] (http://i.stack.imgur.com/Pi1mr.png) Grundstücke. – lanery

+0

Dies ist Dezember 2013 oder 2002 (zumindest in den USA und UK) wie es am Sonntag beginnt ... Fügen Sie Leerzeichen am Anfang, so dass es eher wie eine echte Kalender-Seite ist .. natürlich habe ich bereits uplooted ... – gboffi

+0

Während ich deinen Vorschlag @gboffi mag, nachdem ich für eine kleine Weile herumgespielt habe, denke ich, dass es mehr Ärger verursachen kann, als es wert ist. Sie können den Offset mit 'datetime.datetime (Jahr, Monat, Tag) .weekday()' erhalten, aber es scheint nicht so einfach zu sein, wie den Offset zu 'gs [day]' hinzuzufügen. Da der Hauptzweck nur die Datenvisualisierung und nicht die tatsächliche Korrespondenz mit dem Kalender ist, überlasse ich das als Übung für den Leser :) – lanery