<p>实际上,您需要对<code>Y</code>值应用以下转换:<code>-log10(1-y)</code>。这施加了<code>y < 1</code>的唯一限制,因此您应该能够在转换后的绘图上有负值。在</p>
<p>下面是一个来自<code>matplotlib</code>文档的修改后的<a href="http://matplotlib.org/examples/api/custom_scale_example.html" rel="noreferrer">example</a>,它展示了如何将自定义转换合并到“scales”中:</p>
<pre><code>import numpy as np
from numpy import ma
from matplotlib import scale as mscale
from matplotlib import transforms as mtransforms
from matplotlib.ticker import FixedFormatter, FixedLocator
class CloseToOne(mscale.ScaleBase):
name = 'close_to_one'
def __init__(self, axis, **kwargs):
mscale.ScaleBase.__init__(self)
self.nines = kwargs.get('nines', 5)
def get_transform(self):
return self.Transform(self.nines)
def set_default_locators_and_formatters(self, axis):
axis.set_major_locator(FixedLocator(
np.array([1-10**(-k) for k in range(1+self.nines)])))
axis.set_major_formatter(FixedFormatter(
[str(1-10**(-k)) for k in range(1+self.nines)]))
def limit_range_for_scale(self, vmin, vmax, minpos):
return vmin, min(1 - 10**(-self.nines), vmax)
class Transform(mtransforms.Transform):
input_dims = 1
output_dims = 1
is_separable = True
def __init__(self, nines):
mtransforms.Transform.__init__(self)
self.nines = nines
def transform_non_affine(self, a):
masked = ma.masked_where(a > 1-10**(-1-self.nines), a)
if masked.mask.any():
return -ma.log10(1-a)
else:
return -np.log10(1-a)
def inverted(self):
return CloseToOne.InvertedTransform(self.nines)
class InvertedTransform(mtransforms.Transform):
input_dims = 1
output_dims = 1
is_separable = True
def __init__(self, nines):
mtransforms.Transform.__init__(self)
self.nines = nines
def transform_non_affine(self, a):
return 1. - 10**(-a)
def inverted(self):
return CloseToOne.Transform(self.nines)
mscale.register_scale(CloseToOne)
if __name__ == '__main__':
import pylab
pylab.figure(figsize=(20, 9))
t = np.arange(-0.5, 1, 0.00001)
pylab.subplot(121)
pylab.plot(t)
pylab.subplot(122)
pylab.plot(t)
pylab.yscale('close_to_one')
pylab.grid(True)
pylab.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/yZILQ.png" rel="noreferrer"><img src="https://i.stack.imgur.com/yZILQ.png" alt="normal and transformed plot"/></a></p>
<p>请注意,您可以通过关键字参数控制9的数量:</p>
^{pr2}$
<p><a href="https://i.stack.imgur.com/tY9tv.png" rel="noreferrer"><img src="https://i.stack.imgur.com/tY9tv.png" alt="plot with 3 nine's"/></a></p>