2017-03-03 6 views
-1

Ich habe einen Code, der zwei verschiedene Graphen erzeugen und sie in ein Bild einfügen sollte und ich kann nicht herausfinden, warum es den zuletzt genannten Graphen zweimal zurückgibt. Der Code lautet wie folgt:Wie kann verhindert werden, dass Stapelplots die Plots wiederholen?

import spacepy as sp 
from spacepy import pycdf 
from pylab import * 
from spacepy.toolbox import windowMean, normalize 
from spacepy.plot.utils import annotate_xaxis 
import pylab 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import matplotlib.mlab as mlab 
import matplotlib.cbook as cbook 
import matplotlib.ticker as ticker 
from matplotlib.colors import LogNorm 
from matplotlib.ticker import LogLocator 
from matplotlib.dates import DateFormatter 
from matplotlib.dates import DayLocator, HourLocator, MinuteLocator 
from matplotlib import rc, rcParams 
import matplotlib.dates as mdates 
import datetime as dt 
import bisect as bi 
import seaborn as sea 
import sys 
import os 
import multilabel as ml 
import pandas as pd 

sea.set_context('poster') 
# sea.set_style('ticks',{'axes.facecolor':'yellow'}) 
sea.set_style('whitegrid') 
sea.set_palette('muted',color_codes=True) 
rc('text', usetex=True) 
rc('font', family='Mono') 
rcParams['text.latex.preamble']=[r'\usepackage{amsmath}'] 

MMS_1_HPCA_SURVEY_ION = pycdf.CDF(r'/home/ary/Desktop/Arya/Project/Data/MMS/1/HPCA/Survey/Ion/mms1_hpca_srvy_l2_ion_20151025120000_v1.0.0.cdf') 

EPOCH_SURVEY_ION_1 = MMS_1_HPCA_SURVEY_ION['Epoch'][...] 
H_Flux_SURVEY_ION_1 = MMS_1_HPCA_SURVEY_ION['mms1_hpca_hplus_flux'][...] 
O_Flux_SURVEY_ION_1 = MMS_1_HPCA_SURVEY_ION['mms1_hpca_oplus_flux'][...] 
Ion_Energy_SURVEY_ION_1 = MMS_1_HPCA_SURVEY_ION['mms1_hpca_ion_energy'][...] 

MMS_SURVEY_ION_1_Start_time = dt.datetime(2015, 10, 25, 12, 0, 0, 908117) 
MMS_SURVEY_ION_1_Finish_time = dt.datetime(2015, 10, 25, 16, 22, 24, 403623) 

dt_MMS = dt.timedelta(seconds = 15) 

plt.close('all') 

fig_MMS, axs_MMS = plt.subplots(2,sharex=True) 
cmap = plt.get_cmap(cm.jet) 
cmap.set_bad('black') 

sidx_MMS_1_SURVEY_ION = bi.bisect_left(EPOCH_SURVEY_ION_1,MMS_SURVEY_ION_1_Start_time) 
sidx_MMS_1_SURVEY_ION = int(sidx_MMS_1_SURVEY_ION-(sidx_MMS_1_SURVEY_ION/100)) 
lidx_MMS_1_SURVEY_ION = bi.bisect_left(EPOCH_SURVEY_ION_1, MMS_SURVEY_ION_1_Finish_time) 
lidx_MMS_1_SURVEY_ION = int(lidx_MMS_1_SURVEY_ION+((len(EPOCH_SURVEY_ION_1)-lidx_MMS_1_SURVEY_ION)/100)) 

if MMS_SURVEY_ION_1_Start_time.date() == MMS_SURVEY_ION_1_Finish_time.date(): 
    stopfmt = '%H:%M' 
else: 
    stopfmt = '%-m/%-d/%y %H:%M' 

title_1 = MMS_SURVEY_ION_1_Start_time.strftime('%m/%d/%y %H:%M')+' -'+MMS_SURVEY_ION_1_Finish_time.strftime(stopfmt) 

if dt_MMS.seconds !=0: 
    title_1 = title_1 + ' with '+str(dt_MMS.seconds)+' second time averaging' 

for j, ax in enumerate(axs_MMS.T.flatten()): 
    flix_1 = np.array(H_Flux_SURVEY_ION_1[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION, 
              j, :].T) 

    if dt_MMS==dt.timedelta(0): 
     fluxwin_1 = flix_1 
     timewin_1 = EPOCH_SURVEY_ION_1[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION] 
    else: 
     fluxwin_1=[[0 for y in range(len(flix_1))] for x_1 in range(len(flix_1))] 
     for i, flox in enumerate(flix_1): 
      fluxwin_1[i], timewin_1 = windowMean(flox, EPOCH_SURVEY_ION_1[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION], 
               winsize=dt_MMS, overlap=dt.timedelta(0)) 
      fluxwin_1[i] = np.array(fluxwin_1[i]) 
      for x_1 in np.where(np.diff(EPOCH_SURVEY_ION_1[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION]) 
        >dt.timedelta(hours=1))[0]+sidx_MMS_1_SURVEY_ION: 
       fluxwin_1[i][bi.bisect_right(timewin_1, EPOCH_SURVEY_ION_1[x_1]):bi.bisect_right(timewin_1, 
                           EPOCH_SURVEY_ION_1[x_1+1])]=0 
     fluxwin_1 = np.array(fluxwin_1) 

    fluxwin_1[np.where(fluxwin_1<=0)] = 0 

    x_1 = mdates.date2num(timewin_1) 

    pax_1 = ax.pcolormesh(x_1, Ion_Energy_SURVEY_ION_1, fluxwin_1, shading='turkey',cmap=cmap, vmin=1, 
          vmax=np.nanmax(H_Flux_SURVEY_ION_1[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION,:,:]), 
          norm=LogNorm()) 

    sax_1 = ax.twinx() 
    plt.setp(sax_1.get_yticklabels(), visible=False) 
    sax_1.tick_params(axis='y', right='off') 
    ax.set_xlim(MMS_SURVEY_ION_1_Start_time, MMS_SURVEY_ION_1_Finish_time) 
    ax.set_yscale('log') 
    ax.set_yticks([10, 100, 1000,10000]) 
    #Allows non-log formatted values to be used for ticks 
    ax.yaxis.set_major_formatter(plt.ScalarFormatter()) 

axs_MMS[0].set_ylabel('Energy (eV)') 
axs_MMS[0].set_title(title_1) 

for j, ax in enumerate(axs_MMS.T.flatten()): 
    flix_2 = np.array(O_Flux_SURVEY_ION_1[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION, 
              j, :].T) 

    if dt_MMS==dt.timedelta(0): 
     fluxwin_2 = flix_2 
     timewin_2 = EPOCH_SURVEY_ION_2[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION] 
    else: 
     fluxwin_2=[[0 for y in range(len(flix_2))] for x_2 in range(len(flix_2))] 
     for i, flox in enumerate(flix_2): 
      fluxwin_2[i], timewin_2 = windowMean(flox, EPOCH_SURVEY_ION_1[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION], 
               winsize=dt_MMS, overlap=dt.timedelta(0)) 
      fluxwin_2[i] = np.array(fluxwin_2[i]) 
      for x_2 in np.where(np.diff(EPOCH_SURVEY_ION_1[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION]) 
        >dt.timedelta(hours=1))[0]+sidx_MMS_1_SURVEY_ION: 
       fluxwin_2[i][bi.bisect_right(timewin_2, EPOCH_SURVEY_ION_1[x_2]):bi.bisect_right(timewin_2, 
                           EPOCH_SURVEY_ION_1[x_1+1])]=0 
     fluxwin_2 = np.array(fluxwin_2) 

    fluxwin_2[np.where(fluxwin_2<=0)] = 0 

    x_2 = mdates.date2num(timewin_2) 

    pax_2 = ax.pcolormesh(x_2, Ion_Energy_SURVEY_ION_1, fluxwin_2, shading='turkey',cmap=cmap, vmin=1, 
          vmax=np.nanmax(O_Flux_SURVEY_ION_1[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION,:,:]), 
          norm=LogNorm()) 

    sax_2 = ax.twinx() 
    plt.setp(sax_2.get_yticklabels(), visible=False) 
    sax_2.tick_params(axis='y', right='off') 
    ax.set_xlim(MMS_SURVEY_ION_1_Start_time, MMS_SURVEY_ION_1_Finish_time) 
    ax.set_yscale('log') 
    ax.set_yticks([10, 100, 1000,10000]) 
    #Allows non-log formatted values to be used for ticks 
    ax.yaxis.set_major_formatter(plt.ScalarFormatter()) 

axs_MMS[1].set_ylabel('Energy (eV)') 

cbar_ax_1 = fig_MMS.add_axes([0.93, 0.15, 0.02, 0.7]) 

cb_MMS_1 = fig_MMS.colorbar(pax_1, cax=cbar_ax_1) 
cb_MMS_1.set_label(r'Counts sec$^{-1}$ ster$^{-1}$ cm$^{-2}$ keV$^{-1}$') 
#Sets the colorbar value range 
cb_MMS_1.set_clim(1, np.nanmax(H_Flux_SURVEY_ION_1[sidx_MMS_1_SURVEY_ION:lidx_MMS_1_SURVEY_ION,:,:])) 
#Redraws the colorbar 
cb_MMS_1.draw_all() 

und das Bild zurück Aussehen als solche:

enter image description here

+0

Ich glaube, Sie brauchen das Konzept eines [MCVE] zu verstehen. Dieser Code ist nicht minimal (viel zu lang, zu viele unnötige Details) und ist nicht vollständig oder verifizierbar, da er nicht verfügbare externe Daten übermäßig nutzt. – ImportanceOfBeingErnest

+0

Es gibt viele Dinge, die Sie berücksichtigen müssen, wenn Sie Daten aus quasi zuverlässigen Quellen aufnehmen. Es gibt Fehler bei jeder Datei, die berücksichtigt werden müssen und wenn nicht, könnte die Integrität eines Forschungsprojekts gefährdet werden. Zusätzliche Schritte, um zu überprüfen, ob die Daten korrekt sind oder zusätzliche Schritte zur Korrektur von Daten erforderlich sind, sind ein Muss auf dem Gebiet der Datenwissenschaft. In der Programmierung verstehe ich die Idee der Einfachheit, dies ist jedoch nicht der Fall. – anabstudent

+0

Ich sehe nicht, wie sich dies auf die Notwendigkeit bezieht, ein [mcve] zur Verfügung zu stellen, wenn ein Problem in einem Code diskutiert wird. Natürlich sollten Sie keine (unzuverlässigen) externen Daten verwenden, sondern die notwendigen Daten selbst bereitstellen (wie in meiner Antwort unten). – ImportanceOfBeingErnest

Antwort

0

das folgende Beispiel betrachten, die zu Ihrem Code entspricht:

import matplotlib.pyplot as plt 

fig, axs = plt.subplots(2,sharex=True, figsize=(4,2.4)) 

for j, ax in enumerate(axs.T.flatten()): 
    x_1 = [[0,1,2],[0,1,2],[0,1,2]] 
    y_1 = [[0,0,0],[1,1,1],[2,2,2]] 
    z_1 = [[6,5,4],[2,3,4],[6,5,4]] 

    pax_1 = ax.pcolormesh(x_1, y_1, z_1) 

axs[0].set_ylabel('Energy (eV)') 
axs[0].set_title("Title1") 

for j, ax in enumerate(axs.T.flatten()): 
    x_2 = [[3,4,5],[3,4,5],[3,4,5]] 
    y_2 = [[0,0,0],[1,1,1],[2,2,2]] 
    z_2 = [[2,1,2],[2,1,2],[2,1,2]] 

    pax_2 = ax.pcolormesh(x_2, y_2, z_2) 

axs[1].set_ylabel('Energy (eV)') 
plt.show() 

enter image description here

Hier plotten Sie jeden Plo t beide Achsen.

Stattdessen müssen Sie die verschiedenen Achsen zeichnen:

import matplotlib.pyplot as plt 

fig, axs = plt.subplots(2,sharex=True, figsize=(4,2.4)) 

x_1 = [[0,1,2],[0,1,2],[0,1,2]] 
y_1 = [[0,0,0],[1,1,1],[2,2,2]] 
z_1 = [[6,5,4],[2,3,4],[6,5,4]] 

pax_1 = axs[0].pcolormesh(x_1, y_1, z_1) 

axs[0].set_ylabel('Energy (eV)') 
axs[0].set_title("Title1") 

x_2 = [[3,4,5],[3,4,5],[3,4,5]] 
y_2 = [[0,0,0],[1,1,1],[2,2,2]] 
z_2 = [[2,1,2],[2,1,2],[2,1,2]] 

pax_2 = axs[1].pcolormesh(x_2, y_2, z_2) 

axs[1].set_ylabel('Energy (eV)') 
plt.show() 

enter image description here

+0

Grundsätzlich bestand die Lösung darin, pcolormesh aus der 'for'-Schleife zu nehmen und die entsprechende Subachsenposition zu setzen – anabstudent

Verwandte Themen