matplotlib contourf plot中的对称日志色标

时间:2014-10-22 23:15:49

标签: python python-2.7 matplotlib contour contourf

如何为轮廓创建带有symlog(对称日志)比例的等高线图。即显示负值和正值的对数刻度。

一种可能性是解决这个例子:

http://matplotlib.org/examples/pylab_examples/contourf_log.html

这给出了日志比例的配方:

from matplotlib import pyplot, ticker
cs = pyplot.contourf(X, Y, z, locator=ticker.LogLocator())

但是,这并不允许负值。有ticker.SymmetricalLogLocator()可能是解决方案,但它似乎没有太多文档。

修改

为了澄清(因为在日志范围内请求负值可能听起来没有意义),我想要的是" symlog"在matplotlib轴上提供的比例。下图(取自another stack exchange post)显示x轴上的symlog。这是一个" log"缩放,但以一种对观众清楚的方式处理负值。

Symlog example

我想要相同的缩放比例,但是对于轮廓或轮廓f上的色阶。

1 个答案:

答案 0 :(得分:0)

我偶然发现了这个线程试图做同样的事情,即在正方向和负方向上绘制大范围的值。此外,我希望粒度与imshow一样精细。

事实证明,您可以使用“ticker.MaxNLocator(nbins)”,其中nbins可以设置为高,以具有精细的粒度,例如将nbins设置为100。

我还希望有一个很好的Latex风格的自动收报机格式,我刚才在StackOverflow上找到了解决方案。

我将在此处的一个类中发布此代码段,以便任何可能需要的人都可以了解它的工作原理。我使用此解决方案生成多个绘图,如下图所示。

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

# function for nice Latex style tick formatting
# copied from
# http://stackoverflow.com/questions/25983218/
# scientific-notation-colorbar-in-matplotlib
# output formating for colorbar in 2D plots
def fmt(x, pos):
  a, b = '{:.2e}'.format(x).split('e')
  b = int(b)
  return r'${} \times 10^{{{}}}$'.format(a, b)

# A confourf function I use inside one of my classes
# mainly interesting are the "plot" and "cbar" lines
def Make2DSubPlot(self, posIdent, timeIdx,typeIdx):
  plt.subplot(posIdent)
  y = self.radPos
  x = self.axPos
  z = self.fieldList[timeIdx][typeIdx]
  plot = plt.contourf(x, y, z, locator=ticker.MaxNLocator(100), \
          aspect='auto',origin='lower')
  cbar = plt.colorbar(plot, orientation='vertical', \
          format=ticker.FuncFormatter(fmt))
  cbar.ax.set_ylabel(self.labelList[typeIdx])
  plt.xlabel(self.labelList[self.iax])
  plt.ylabel(self.labelList[self.iax])

enter image description here