Python中的反转轴方向
我有这个函数,修改自Python中的反转轴方向,python,axis,labels,Python,Axis,Labels,我有这个函数,修改自 #/usr/bin/env python #版权:本文件已被置于公共领域。 """ 泰勒图(Taylor,2001)测试实现。 http://www-pcmdi.llnl.gov/about/staff/Taylor/CV/Taylor_diagram_primer.htm """ __version=“时间戳:” __作者(Yannick Copin) 将numpy作为NP导入 将matplotlib.pyplot作为PLT导入 TaylorDiagram类(对象): “
#/usr/bin/env python
#版权:本文件已被置于公共领域。
"""
泰勒图(Taylor,2001)测试实现。
http://www-pcmdi.llnl.gov/about/staff/Taylor/CV/Taylor_diagram_primer.htm
"""
__version=“时间戳:”
__作者(Yannick Copin)
将numpy作为NP导入
将matplotlib.pyplot作为PLT导入
TaylorDiagram类(对象):
“泰勒图:绘制模型标准偏差和相关性
参考单象限极坐标图中的(数据)样本
r=STDEV,θ=arccos(相关性)。
"""
定义初始化(self,refstd,fig=None,rect=111,label=''):
“”“设置泰勒图轴,即单象限极坐标
使用mpl_toolkits.AxisArtister.floating_Axis.refstd打印
要比较的参考标准偏差。
"""
从matplotlib.projections导入极坐标
将mpl_toolkits.AxisArtister.floating_轴作为FA导入
将mpl_toolkits.AxisArtister.grid_finder作为GF导入
self.refstd=refstd#参考标准偏差
tr=PolarAxes.PolarTransform()
#相关正标签
rlocs=NP.连接(([-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)#极角转换
gl1=GF.固定定位器(tlocs)#位置
tf1=GF.DictFormatter(dict(zip(tlocs,map(str,rlocs)))
#标准偏差轴范围
self.smin=0
self.smax=2*self.refstd/self.refstd
ghelper=FA.GridHelperCurveLinear(tr,
极值=(0,NP.pi,#第1象限
self.smin,self.smax),
网格定位器1=gl1,
勾选格式化程序1=tf1,
)
如果fig为无:
图=PLT.图()
ax=FA.FloatingSubplot(图、矩形、网格\u helper=ghelper)
图添加_子批次(ax)
#调整轴
ax.轴[“顶部”]。设置_轴_方向(“底部”)#“角度轴”
ax.轴[“顶部”]切换(ticklabels=True,label=True)
ax.轴[“顶部”]。主刻度标签。设置轴方向(“顶部”)
轴[“顶部”]标签。设置轴方向(“顶部”)
轴[“顶部”]。标签。设置文本(“相关性”)
轴[“左”]。设置轴方向(“右”)#“X轴”
轴[“右”]切换(ticklebels=True)
ax.轴[“右”]。主刻度标签。设置轴方向(“底部”)
#ax.轴[“底部”]标签.设置文本(“标准偏差”)
轴[“右”]。设置轴方向(“左”)#“Y轴”
#轴[“右”]切换(ticklebels=True)
ax.轴[“右”]。主刻度标签。设置轴方向(“右”)
ax.轴[“底部”]。设置为可见(假)#无用
#沿标准差的等高线
ax.grid(假)
自。_ax=ax#图形轴
self.ax=ax.get_辅助轴(tr)#极坐标
#添加参考点和STDEV等高线
打印“参考标准:”,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.类零(t)+self.refstd/self.refstd
self.ax.plot(t,r,'k--',label='''uU')
#收集样本点以供以后使用(例如图例)
self.samplePoints=[l]
def add_样本(自身、标准差、修正系数、*args、**kwargs):
“”“将示例(stddev、corrcoff)添加到泰勒图中。args
和KWARG直接传播到Figure.plot
命令。”“”
l、 =self.ax.plot(NP.arccos(corrcoef)),stddev/self.refstd,
*args,**kwargs)#(θ,半径)
self.samplePoints.append(l)
返回l
def add_等高线(自身,标高=5,**kwargs):
“”“添加以常数为中心的RMS差等高线。”“”
rs,ts=NP.meshgrid(NP.linspace(self.smin,self.smax),
NP.linspace(0,NP.pi))
#计算中心均方根差
rms=NP.sqrt((自参考标准/自参考标准)**2+rs**2-2*(自参考标准/自参考标准)*rs*NP.cos(ts))
等高线=自身最大等高线(ts、rs、rms、标高,**kwargs)
回归等值线
如果“名称”=“\uuuuuuuu主要”:
#参考数据集
x=NP.linspace(0,4*NP.pi,100)
数据=NP.sin(x)
参考标准=数据标准(ddof=1)#参考标准偏差
#模型
m1=数据+0.2*NP.random.randn(len(x))#模型1
m2=0.8*数据+0.1*NP.random.randn(len(x))#模型2
m3=NP.sin(x-NP.pi/10)#模型3
#计算模型的STDEV和相关系数
samples=NP.array([[m.std(ddof=1),NP.corrcoef(data,m)[0,1]]
对于m英寸(m1,m2,m3)])
图=PLT.图(图尺寸=(10,4))
ax1=图add_子批次(1,2,1,xlabel='X',ylabel='Y')
#泰勒图
直径=TaylorDiagram(参考标准,图=fig,rect=122,标签=“参考”)
颜色=PLT.matplotlib.cm.jet(NP.linspace(0,1,len(样本)))
ax1.绘图(x,数据,'ko',标签='data')
对于枚举中的i,m([m1,m2,m3]):
ax1.plot(x,m,c=colors[i],label='Model%d'(i+1))
ax1.图例(numpoints=1,prop=dict(size='small'),loc='best')
#向泰勒图中添加示例
对于枚举(样本)中的i(stddev,corrcoef):
直径添加样本(标准偏差、误差、标记='s',ls='',c=颜色[i],
label=“型号%d”%(i+1))
#添加RMS等高线,并为其添加标签
等高线=直径添加等高线(颜色=0.5')
PLT.clabel(等高线,内联=1,字体大小=10)
#添加人物图例
图图例(直径取样点,
[p.获取直径采样点中p的_标签],
numpoints=1,prop=dict(size='small'),l
#!/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 <yannick.copin@laposte.net>"
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()
ax.axis["right"].major_ticklabels.set_axis_direction("right")
ax.axis["right"].major_ticklabels.set_axis_direction("bottom")