Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以使用Python3'将数字四舍五入为数百、数千等;s编号格式 具体问题_Python_Python 3.x_Matplotlib_Formatting_Seaborn - Fatal编程技术网

可以使用Python3'将数字四舍五入为数百、数千等;s编号格式 具体问题

可以使用Python3'将数字四舍五入为数百、数千等;s编号格式 具体问题,python,python-3.x,matplotlib,formatting,seaborn,Python,Python 3.x,Matplotlib,Formatting,Seaborn,我正试图打印出seaborn热图中单元格顶部的数字。例如,类似于: ax = sns.heatmap(flights, annot=True, fmt=",") (这是直接取自,调整为Python 3友好型。因此,如果导入seaborn,您可以立即运行相同的示例。) 这就产生了一个相当可观的数字,如下所示: 但是,我希望看到数字四舍五入到最接近的百位。换句话说,我希望看到像171这样的数字写为200,315写为300,等等 思想 在引擎盖下,seaborn实际上就是matplotlib。

我正试图打印出seaborn热图中单元格顶部的数字。例如,类似于:

ax = sns.heatmap(flights, annot=True, fmt=",")
(这是直接取自,调整为Python 3友好型。因此,如果导入
seaborn
,您可以立即运行相同的示例。)


这就产生了一个相当可观的数字,如下所示:

但是,我希望看到数字四舍五入到最接近的百位。换句话说,我希望看到像171这样的数字写为200,315写为300,等等


思想 在引擎盖下,
seaborn
实际上就是
matplotlib
。我可以使用
matplotlib

matplotlib
的文本依赖于Python3,Python3可以方便地将四舍五入到小数点的右侧,方法是执行
.2
四舍五入到小数点的第一百个***位,但我找不到任何其他方向的四舍五入


我可以在将数字推送到绘图之前简单地将其四舍五入,但这实际上会改变绘图数据本身,我宁愿避免这种情况。因此,我希望将传递给绘图的基本数字保持不变,同时仍然能够很好地打印内容


据我所知,做这件事的唯一方法是找到一种巧妙的方式来格式化东西。有办法吗

谢谢

更新 我进一步深入研究,试图理解为什么La Rooy下面的聪明解决方案对我不起作用

seaborn
代码中的相关行为:

val = ("{:" + self.fmt + "}").format(val)

然而,为了使其工作,我需要能够改变我的
pandas
dataframe列,这意味着我需要能够调整
nd.array
元素的列

似乎有,但有一个努力创造一个

所以,我现在不打算进一步讨论这个问题,希望一旦事情解决了,我能接受拉鲁伊的解决方案,事情应该会“起作用”

一旦发生这种情况,解决方案将是:

>>> class rndarray(np.ndarray):
...     def __format__(self, spec):
...         return np.ndarray.__format__(int(round(self, -2)), spec)
... 
>>> df['<col_of_interest>'] = map(rndarray, df['<col_of_interest.'])
>>等级rndarray(np.ndarray):
...     定义格式(自身、规范):
...         返回np.ndarray.\uuuuuu格式\uuuu(int(舍入(self,-2)),spec)
... 
>>>df[''']=map(rndarray,df['>>df['')。值=map(rndarray,df['Does


对于每个单元格,都可以解决您的问题?

您可以使用
int
的子类,并根据自己的喜好定义
\uuuuuuuuuuuuuuuu

>>> class rint(int):
...     def __format__(self, spec):
...         return int.__format__(int(round(self, -2)), spec)
... 
>>> raw_data = [111, 22222, 33333]
>>> data = map(rint, raw_data)
>>> [format(x, ',') for x in data]
['100', '22,200', '33,300']
或相当于浮点数

>>> class rfloat(float):
...     def __format__(self, spec):
...         return float.__format__(round(self, -2), spec)
... 
>>> raw_data = [111.11, 22222.22, 33333.33]
>>> data = map(rfloat, raw_data)
>>> spec = ',.0f'
>>> [format(x, spec) for x in data]
['100', '22,200', '33,300']
编辑: 这个更具黑客性的解决方案利用了
val=(“{:“+self.fmt+”}”).format(val)
行。当然,如果实现发生更改,这可能会中断

class Fmt(str):
    def __add__(self, other):
        return Fmt(str.__add__(self, other))
    def __radd__(self, other):
        return Fmt(str.__add__(other, self))
    def format(self, *args):
        return str.format(self, *(int(round(x, -2)) for x in args))

ax = sns.heatmap(flights, annot=True, fmt=Fmt(","))

最好能够传递一个
Formatter()
而不是一个
fmt
字符串。

谢谢您的建议,@B0dz1o,但它没有。问题是参数
fmt
接受一个简单的文本值。因此,我可以传递
“{.0f}00’
,也许吧,但我不可能提前要求我的号码除以100。(我甚至不认为我可以传递那个字符串…
fmt
似乎只接受花括号内的部分。好主意!!这实际上似乎不适用于
seaborn
,因为我怀疑这是因为我需要进一步了解seaborn实际上是如何调用格式函数的。不管如何它在引擎盖下工作,这让我走上了正确的轨道。谢谢!仍然不起作用,但我更新了原始问题,并进一步详细解释了这个问题。你的方法已经过时了,IMHO,但np.ndarray还没有准备好参与你的优雅。
>>> class rfloat(float):
...     def __format__(self, spec):
...         return float.__format__(round(self, -2), spec)
... 
>>> raw_data = [111.11, 22222.22, 33333.33]
>>> data = map(rfloat, raw_data)
>>> spec = ',.0f'
>>> [format(x, spec) for x in data]
['100', '22,200', '33,300']
class Fmt(str):
    def __add__(self, other):
        return Fmt(str.__add__(self, other))
    def __radd__(self, other):
        return Fmt(str.__add__(other, self))
    def format(self, *args):
        return str.format(self, *(int(round(x, -2)) for x in args))

ax = sns.heatmap(flights, annot=True, fmt=Fmt(","))