2017-02-22 118 views
2

我有這個功能,從ycopin - GitHub修改。在Python中反轉座標軸方向

#!/usr/bin/env python 
# Copyright: This document has been placed in the public domain. 

""" 
Taylor diagram (Taylor, 2001) test implementation. 
http://www-pcmdi.llnl.gov/about/staff/Taylor/CV/Taylor_diagram_primer.htm 
""" 

__version__ = "Time-stamp: <2012-02-17 20:59:35 ycopin>" 
__author__ = "Yannick Copin <[email protected]>" 

import numpy as NP 
import matplotlib.pyplot as PLT 

class TaylorDiagram(object): 
    """Taylor diagram: plot model standard deviation and correlation 
    to reference (data) sample in a single-quadrant polar plot, with 
    r=stddev and theta=arccos(correlation). 
    """ 

    def __init__(self, refstd, fig=None, rect=111, label='_'): 
     """Set up Taylor diagram axes, i.e. single quadrant polar 
     plot, using mpl_toolkits.axisartist.floating_axes. refstd is 
     the reference standard deviation to be compared to. 
     """ 

     from matplotlib.projections import PolarAxes 
     import mpl_toolkits.axisartist.floating_axes as FA 
     import mpl_toolkits.axisartist.grid_finder as GF 

     self.refstd = refstd   # Reference standard deviation 

     tr = PolarAxes.PolarTransform() 

     # Correlation positive labels 
     rlocs = NP.concatenate(([-0.99,-0.9],NP.arange(-0.8,0,0.2), 
           NP.arange(0,0.9,0.2),[0.9,0.99])) 
     tlocs = NP.arccos(rlocs)  # Conversion to polar angles 
     gl1 = GF.FixedLocator(tlocs) # Positions 
     tf1 = GF.DictFormatter(dict(zip(tlocs, map(str,rlocs)))) 

     # Standard deviation axis extent 
     self.smin = 0 
     self.smax = 2*self.refstd/self.refstd 

     ghelper = FA.GridHelperCurveLinear(tr, 
              extremes=(0,NP.pi, # 1st quadrant 
                self.smin,self.smax), 
              grid_locator1=gl1, 
              tick_formatter1=tf1, 
              )       


     if fig is None: 
      fig = PLT.figure() 

     ax = FA.FloatingSubplot(fig, rect, grid_helper=ghelper) 
     fig.add_subplot(ax) 

     # Adjust axes 
     ax.axis["top"].set_axis_direction("bottom") # "Angle axis" 
     ax.axis["top"].toggle(ticklabels=True, label=True) 
     ax.axis["top"].major_ticklabels.set_axis_direction("top") 
     ax.axis["top"].label.set_axis_direction("top") 
     ax.axis["top"].label.set_text("Correlation") 


     ax.axis["left"].set_axis_direction("right") # "X axis" 
     ax.axis["right"].toggle(ticklabels=True) 
     ax.axis["right"].major_ticklabels.set_axis_direction("bottom") 

     #ax.axis["bottom"].label.set_text("Standard deviation") 

     ax.axis["right"].set_axis_direction("left") # "Y axis" 
     #ax.axis["right"].toggle(ticklabels=True) 
     ax.axis["right"].major_ticklabels.set_axis_direction("right") 

     ax.axis["bottom"].set_visible(False)   # Useless 

     # Contours along standard deviations 
     ax.grid(False) 

     self._ax = ax     # Graphical axes 
     self.ax = ax.get_aux_axes(tr) # Polar coordinates 

     # Add reference point and stddev contour 
     print "Reference std:", self.refstd/self.refstd 
     l, = self.ax.plot([0], self.refstd/self.refstd, 'k*', 
          ls='', ms=10, label=label) 
     t = NP.linspace(0, NP.pi) 
     r = NP.zeros_like(t) + self.refstd/self.refstd 
     self.ax.plot(t,r, 'k--', label='_') 

     # Collect sample points for latter use (e.g. legend) 
     self.samplePoints = [l] 

    def add_sample(self, stddev, corrcoef, *args, **kwargs): 
     """Add sample (stddev,corrcoeff) to the Taylor diagram. args 
     and kwargs are directly propagated to the Figure.plot 
     command.""" 

     l, = self.ax.plot(NP.arccos(corrcoef), stddev/self.refstd, 
          *args, **kwargs) # (theta,radius) 
     self.samplePoints.append(l) 

     return l 

    def add_contours(self, levels=5, **kwargs): 
     """Add constant centered RMS difference contours.""" 

     rs,ts = NP.meshgrid(NP.linspace(self.smin,self.smax), 
          NP.linspace(0,NP.pi)) 
     # Compute centered RMS difference 
     rms = NP.sqrt((self.refstd/self.refstd)**2 + rs**2 - 2*(self.refstd/self.refstd)*rs*NP.cos(ts)) 

     contours = self.ax.contour(ts, rs, rms, levels, **kwargs) 

     return contours 


if __name__=='__main__': 

    # Reference dataset 
    x = NP.linspace(0,4*NP.pi,100) 
    data = NP.sin(x) 
    refstd = data.std(ddof=1)   # Reference standard deviation 

    # Models 
    m1 = data + 0.2*NP.random.randn(len(x)) # Model 1 
    m2 = 0.8*data + .1*NP.random.randn(len(x)) # Model 2 
    m3 = NP.sin(x-NP.pi/10)     # Model 3 

    # Compute stddev and correlation coefficient of models 
    samples = NP.array([ [m.std(ddof=1), NP.corrcoef(data, m)[0,1]] 
         for m in (m1,m2,m3)]) 

    fig = PLT.figure(figsize=(10,4)) 

    ax1 = fig.add_subplot(1,2,1, xlabel='X', ylabel='Y') 
    # Taylor diagram 
    dia = TaylorDiagram(refstd, fig=fig, rect=122, label="Reference") 

    colors = PLT.matplotlib.cm.jet(NP.linspace(0,1,len(samples))) 

    ax1.plot(x,data,'ko', label='Data') 
    for i,m in enumerate([m1,m2,m3]): 
     ax1.plot(x,m, c=colors[i], label='Model %d' % (i+1)) 
    ax1.legend(numpoints=1, prop=dict(size='small'), loc='best') 

    # Add samples to Taylor diagram 
    for i,(stddev,corrcoef) in enumerate(samples): 
     dia.add_sample(stddev, corrcoef, marker='s', ls='', c=colors[i], 
         label="Model %d" % (i+1)) 

    # Add RMS contours, and label them 
    contours = dia.add_contours(colors='0.5') 
    PLT.clabel(contours, inline=1, fontsize=10) 

    # Add a figure legend 
    fig.legend(dia.samplePoints, 
       [ p.get_label() for p in dia.samplePoints ], 
       numpoints=1, prop=dict(size='small'), loc='upper right') 


    PLT.show() 

當它運行時,它顯示了這個FIG1

fig1

我要的是減少數量的X,Y(極軸)滴答......也許五(5,包括參考數據),並將它們水平對齊。任何想法?

編輯:從上圖中這個

通行證: fig2

減少蜱數量

+0

我不明白你想達到什麼目的。你可以把你想要的樣子描述爲另一種方式嗎? –

+0

看我的編輯......這就是我想要的 – Erincon

回答

0

我沒有在目前這個測試自己的一種方式,但基於關閉this link,似乎下面 - 或其一些變化 - 可能工作:

Inside TaylorDiagram.__init__

 ax.axis["right"].major_ticklabels.set_axis_direction("right") 

這條線(或者類似的一個)應該改成這樣:

 ax.axis["right"].major_ticklabels.set_axis_direction("bottom") 

至於蜱和東西的數量,這是我很難僅僅通過現在仔細閱讀文檔弄清楚,但請嘗試執行help(ax.axis["right"].major_ticklabels)並查看關於刻度標籤的內容。至少可以在某處列出您可以編輯或設置的列表。