可以使用Python3'将数字四舍五入为数百、数千等;s编号格式 具体问题
我正试图打印出seaborn热图中单元格顶部的数字。例如,类似于:可以使用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。
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(","))