2017-04-10 10 views
0

을 생산하는 방법.하기 matplotlib : <img src="https://i.stack.imgur.com/1I7Tq.png" alt="Expected output"></p> <p>다음과 같이 사용할 수있는 소스 코드입니다 : 내가 파이썬 2</p> <p>으로 예상 출력을하기 matplotlib를 사용하여이 플롯을 생산하기 위해 노력하고 우아한 플롯

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 
from __future__ import division 
import matplotlib 
import scipy 
from scipy.interpolate import interp1d 
import matplotlib.pyplot as plt 
#import python-mpi todo 

## Initialize #{{{ 
matplotlib.rc('text', usetex=True) 
matplotlib.rc('font',**{'family':'serif','serif':['Computer Modern Roman, Times']}) 
matplotlib.rc('text.latex',unicode=True) 
colors = ("#BB3300", "#8800DD", "#2200FF", "#0099DD", "#00AA00", "#AA8800", 
         "#661100", "#440077", "#000088", "#003366", "#004400", "#554400") 
#}}} 


## In the measured data (calculated and grouped in PKGraph), the order of properties is: 
## x, Nr, Ni, Zr, Zi, eps_r, eps_i, mu_r, mu_i 
## 0 1    5    7 
## In the Riad's simulation data, the order of properties is: 
## x, mu_r, mu_i, eps_r, eps_i, N_r, N_i, Z_r, Z_i 
## 0 1   3    5   7 
properties = [ 
    #{"name":"Refractive index",  "symbol":"$N$",      "meas_col":1, "sim_col":5, "ylim":(0., 3.)}, 
    {"name":"Real permeability",  "symbol":"Permeability $\\mu_{\\mathrm{eff}}'$",   "meas_col":7, "sim_col":1, "ylim":(-.5, 3.)}, 
    {"name":"Imaginary permeability","symbol":"Permeability $\\mu_{\\mathrm{eff}}''$", "meas_col":8, "sim_col":2, "ylim":(-3.5, 1.)}, 
    #{"name":"Permitivitty",   "symbol":"$\\varepsilon$",    "meas_col":5, "sim_col":3, "ylim":(-1.,6.)}, 
     ] 
samples_dir = "particle_statistics/" 
samples = [ 
     #{"file":"sub38.csv",  "name":"sub38", "color":colors[2], "rescaling": 1}, 
     #{"file":"38-40.csv",  "name":"38-40", "color":colors[3], "rescaling": 1}, 
     {"file":"40-50.csv",  "name":"40-50", "color":colors[4], "rescaling": 15./12}, 
     #{"file":"53.csv",   "name":"53",  "color":colors[5], "rescaling": 1}, 
     {"file":"100.csv",  "name":"100",  "color":colors[4], "rescaling": 2, "eps":76.}, 
     ] 
plt.figure(figsize=(10,6)) 
for property_ in properties: 
    for sample in samples: 
     print property_['name'], sample['name'] 
     print " Load measured spectral data from csv file"#{{{ 
     (meas_x, meas_y) = scipy.loadtxt('measured_spectral_data/N'+sample['file'], 
       usecols=(0, property_['meas_col']), unpack=True) 
     #}}} 
     print " Load simulated spectral data from csv file" #{{{ 
     ## Load data 
     (sim_x, sim_y) = scipy.loadtxt("simulated_spectral_data/d39_ff12_eps92.csv", 
       usecols=(0, property_['sim_col']), unpack=True) 

     ## Extend the first and last point for proper interpolation out of bounds 
     sim_x = scipy.append(scipy.array([0]), sim_x) 
     sim_x = scipy.append(sim_x, scipy.array([max(sim_x)*10])) 
     sim_y = scipy.append(sim_y[0:1], sim_y) 
     sim_y = scipy.append(sim_y, sim_y[-2:-1]) 

     ## Value used in the Riad Yahiaoui's simulation 
     sim_particle_size = 39e-6 
     sim_particle_eps = 94 

     ## Normalize effective size to the mean permittivity of TiO2 
     ## which is eps_o=87, eps_e=165 at frequency of 0,5 THz 
     ## TODO: to be discussed: Correction to possible air voids needed to fit the data! 
     #meas_particle_eps = (165+87+87)*(1./3) # _ = , theoretical dense TiO2 
     meas_particle_eps = 94    # suggested in Riad's dis.; this fits well for the '40-50' sample 
     if sample.has_key('eps'): meas_particle_eps = sample['eps'] 

     #}}} 
     print " Load particles and calculate histogram of major/minor axis"#{{{ 
     majors, minors = scipy.loadtxt("particle_statistics/"+sample['file'])/1e6 ## the values were stored in micrometers 

     bins = scipy.arange(2e-6, 140e-6, .1e-6) 
     bin_particle_count = [0]*(len(bins)-1)  # particles_number_in_bin; initialize to zeroes 
     bin_minor_sum = [0]*(len(bins)-1) 

     for n in range(len(bins)-1): 
      for (major, minor) in zip(majors, minors): 
       if (bins[n]<major) and (major<bins[n+1]): 
        bin_particle_count[n] += 1 
        bin_minor_sum[n] += minor 
     #}}} 
     print " Sum the response of the particles according to their histogram"#{{{ 
     ## Initialize variables 
     total_response_n = 0*meas_x 
     total_bins_weight = 0 
     average_particle_totalsize = 0 
     average_particle_totalweight = 0 

     ## Scale some properties with respect to those of vacuum instead of zero 
     vacuum_property = 1. if ("Real" in property_['name']) else 0. 

     for n in [n for n in range(len(bin_particle_count)) if (bin_particle_count[n]>0)]: 
      ## Properties of this bin 
      bin_major = (bins[n]+bins[n+1])/2 
      bin_minor = bin_minor_sum[n]/bin_particle_count[n] 
      bin_particle_size = (1./3*bin_major**-2 + 1./3*bin_minor**-2 + 1./3*bin_minor**-2)**-.5 

      ## The averaging weight (fill factor) of each bin 
      # TODO are oblong elipsoids "maj-min-min" correct? 
      # TODO which power is correct? 
      filling_factor_power = 2 # XXX 
      bin_weight_coef = (bin_particle_size/sim_particle_size)**filling_factor_power 
      bin_weight = bin_particle_count[n] * bin_weight_coef 
      total_bins_weight += bin_weight 

      ## Calculate response of the bin 
      scaled_sim_x = sim_x * (sim_particle_size/bin_particle_size) * (sim_particle_eps/meas_particle_eps) 
      interp_function = interp1d(scaled_sim_x, sim_y, kind='linear', bounds_error=False) 
      bin_response_n = (interp_function(meas_x) - vacuum_property) * bin_weight 
      total_response_n += bin_response_n 

      ## Calculate which particle size is the average 
      average_particle_totalsize += bin_particle_size * bin_weight 
      average_particle_totalweight += bin_weight 

     #}}} 
     print " Get spectrum for average (modus) particle"#{{{ 
     ## Prepare data for "clean" unconvolved resonance curve (of average particle size) 
     #avg_particle_size = average_particle_totalsize/average_particle_totalweight 
     avg_particle_size = bins[bin_particle_count.index(max(bin_particle_count))] 
     print "  ... ", avg_particle_size 
     scaled_sim_x = sim_x * (sim_particle_size/avg_particle_size) * (sim_particle_eps/meas_particle_eps) 
     interp_function = interp1d(scaled_sim_x, sim_y, kind='linear', bounds_error=False) 
     unconv_response = (interp_function(meas_x)-vacuum_property)*sample['rescaling']+vacuum_property 
     #}}} 

     print " Plot the graph"#{{{ 

     ## Plot 
     if 'imag' in property_['name'].lower(): plotsign = -1 
     else: plotsign = 1 
     ax = plt.subplot(len(samples)*10 + len(properties)*100 + samples.index(sample) + 
       len(properties)*properties.index(property_) + 1) 
     last_row= (properties.index(property_) == len(properties)-1) 
     last_column= (samples.index(sample) == len(samples)-1) 
     ax.plot(meas_x, meas_y*plotsign, color=sample['color'], label="Experiment", 
       linewidth=0, marker='o', markersize=3) 
     ax.plot(meas_x, total_response_n/total_bins_weight*sample['rescaling']*plotsign+vacuum_property*plotsign, 
       color='black', label="Simulation", linewidth=1.5, linestyle=('-','--','-.',':')[0]) 
     ax.plot(meas_x, unconv_response*plotsign, color='r', label="Single size", 
       linewidth=1, linestyle=('-','--','-.',':')[0]) 

     ## Annotate 
     if not last_row: 
      ax.text(.95, 0.0, '"'+sample['name']+'" sample', 
        bbox=dict(boxstyle="round,pad=0.1", fc="white", ec="white", lw=.4)) 
     if last_row: 
      if last_column: ax.legend(loc=(.55,.1)) 
      ax.set_xlabel(u"Frequency [THz]") 
     ax.grid(True) 
     ax.set_ylabel(property_['symbol']) 
     ax.set_xlim((0.2, 1.459)) 
     ax.set_ylim(property_['ylim']) 
     #}}} 


print " Finish the graph" 
#plt.savefig("3EOS_convolution_elmajminmin-f-"+property_['name']+"_pow"+`filling_factor_power`+".pdf", bbox_inches='tight') 
plt.savefig("mm2012_convolution.pdf", bbox_inches='tight') 
#plt.savefig("3EOS_convolution_eps094_pow0.png", bbox_inches='tight') 

그러나 나는 이것을 가지고 있지 않습니다. 전류 출력 :
Current output

도와 주시겠습니까? 고맙습니다.

+1

나에게도 똑같이 보입니다. 정확히 현재 출력에 대해 싫어하는 점은 무엇입니까? 귀하의 설명에 정확 해하십시오. – ImportanceOfBeingErnest

+0

관심과 시간을 보내 주셔서 감사합니다. 먼저, 내 눈금을 내고 싶습니다. 둘째, 예상대로 그리드를 재현하고 싶습니다. 셋째, 예상되는 점을 원합니다. 마지막으로 y 축 레이블을 더 잘 정렬하고 싶습니다. 최고. –

답변

0

일반적으로 얼마나 만족스럽지 않은 것 같습니다 matplotlib 2.0 handles the plotting. 따라서 고전 스타일을 사용할 수도 있습니다.

plt.style.use('classic') 

결과가 원하는대로 더 많이 표시됩니다. 나머지 차이점에 대해서는 질문을 업데이트하십시오.

+0

매력처럼 작동합니다! –