2017-03-03 90 views
-1

我應該產生兩個不同的圖形,並把它們放入一個形象,想不通爲什麼它會返回兩次最後提到的圖形代碼。代碼如下:如何防止重複繪製堆棧圖?

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

和返回的圖像看起來就像這樣:

enter image description here

+0

我認爲你需要了解的[MCVE]的概念。此代碼是不是最小的(太長,太多不必要的細節),並且它不是COMPLE或可驗證的,因爲它使excesive無法使用外部數據。 – ImportanceOfBeingErnest

+0

當你開始從準確可靠的數據源獲取數據時,有很多事情需要權衡。必須考慮每個數據文件的錯誤,否則可能會危及研究項目的完整性。採取額外的步驟來驗證數據是正確的還是採取額外的步驟來糾正數據是數據科學領域的必備條件。在編程中我明白簡單的想法,但事實並非如此。 – anabstudent

+0

我不明白這是如何與在代碼中討論問題時提供[mcve]的必要性相關的。當然,你不應該拿任何(不可靠的)外部數據,而是自己提供必要的數據(就像我在下面的答案中所做的那樣)。 – ImportanceOfBeingErnest

回答

0

請看下面的例子對應代碼:

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

在這裏,你繪製每個plo兩個軸。

相反,你需要打印到不同的軸:

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

基本上將溶液取pcolormesh出'for'環,並把適當的子軸線位置 – anabstudent