当前位置: 首页 > 面试题库 >

Python Matplotlib Colorbar科学符号库

庾奇思
2023-03-14
问题内容

我正在尝试在我的matpllotlib Contourf图上自定义颜色条。虽然我能够使用科学记数法,但我尝试更改记数法的基础-
本质上是使我的价格变动范围在(-100,100)而不是(-10,10)内。

例如,这产生了一个简单的情节…

import numpy as np
import matplotlib.pyplot as plt

z = (np.random.random((10,10)) - 0.5) * 0.2

fig, ax = plt.subplots()
plot = ax.contourf(z)
cbar = fig.colorbar(plot)

cbar.formatter.set_powerlimits((0, 0))
cbar.update_ticks()

plt.show()

像这样:

在此处输入图片说明

但是,我希望颜色栏上方的标签为1e-2,数字范围为-10至10。

我将如何处理?


问题答案:

一种可能的解决方案是按以下问题子类化ScalarFormatter并固定其数量级:为多个子图设置具有固定指数和有效数字的科学计数法

这样,你会调用该格式与大小作为参数的顺序orderOOMFormatter(-2, mathText=False)mathText设置为false可以从问题中获取符号,即
在此处输入图片说明
,将其设置为True时,将给出在此处输入图片说明

然后,您可以通过colorbar的format参数将formatter设置为colorbar 。

import numpy as np; np.random.seed(0)
import matplotlib.pyplot as plt
import matplotlib.ticker

class OOMFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, order=0, fformat="%1.1f", offset=True, mathText=True):
        self.oom = order
        self.fformat = fformat
        matplotlib.ticker.ScalarFormatter.__init__(self,useOffset=offset,useMathText=mathText)
    def _set_order_of_magnitude(self):
        self.orderOfMagnitude = self.oom
    def _set_format(self, vmin=None, vmax=None):
        self.format = self.fformat
        if self._useMathText:
             self.format = r'$\mathdefault{%s}$' % self.format


z = (np.random.random((10,10)) - 0.5) * 0.2

fig, ax = plt.subplots()
plot = ax.contourf(z)
cbar = fig.colorbar(plot, format=OOMFormatter(-2, mathText=False))

plt.show()

在此处输入图片说明

对于<3.1的matplotlib版本,该类需要如下所示:

class OOMFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, order=0, fformat="%1.1f", offset=True, mathText=True):
        self.oom = order
        self.fformat = fformat
        matplotlib.ticker.ScalarFormatter.__init__(self,useOffset=offset,useMathText=mathText)
    def _set_orderOfMagnitude(self, nothing):
        self.orderOfMagnitude = self.oom
    def _set_format(self, vmin, vmax):
        self.format = self.fformat
        if self._useMathText:
            self.format = '$%s$' % matplotlib.ticker._mathdefault(self.format)


 类似资料:
  • 我正在尝试减少一些计算后得到的小数数量。我的问题出现的如下所示: 它输出这个: 现在我想将打印的小数位数减少到3。我尝试使用字符串格式进行设置,如下所示: 但是,此代码打印: 我真正想要的是: 如何将格式化为仅显示为科学符号但只有3位小数?

  • 为什么以下代码的输出是科学符号? 产出:1.11E-8

  • 我在pandas中有一个数据框,其中一些数字用科学符号(或指数符号)表示,如下所示: 科学记数法使得本应简单的比较变得不必要的困难。我认为是21900值搞砸了其他值。我的意思是1.0是编码的。一! 这不起作用: 而也没有实现抑制,我绝望地看着,而似乎只对所有其他浮点值打开它,没有能力关闭它。

  • 我在pandas中有一个数据帧,我正在从csv中读取它。 我的一个列的值包括、和科学记数法,即 我的问题是,当我读取csv时,pandas将这些数据视为,而不是它应该是的。我猜是因为它认为科学符号是字符串。 我尝试使用后,尝试使用。这会引发错误

  • 很多问题都解决了这个问题,但没有一个解决方案能完全满足我的需要。 我有一个数据框,有两列数字,每列10-20位。这些实际上是ID,我想将它们连接起来。看起来最好先将值转换为字符串。 然而,当使用转换时,熊猫保留了科学符号,这是不会飞的。 我尝试过的事情: 尝试:dtype arg('str')或转换器(使用)在 结果:

  • 我搜索了一下,但我只找到了如何在没有科学符号的情况下减少数字(所以它最终会像一样,因为数字很小)。