我很难让 seaborn 热力图的刻度标签只显示单个整数(即没有浮点数)。我有两个列表,它们形成数据框的轴,然后使用 seaborn 绘制。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as tkr
x = np.linspace(0, 15, 151)
y = np.linspace(0, 15, 151)
#substitute random data for my_data
df_map = pd.DataFrame(my_data, index = y, columns = x)
plt.figure()
ax = sns.heatmap(df_map, square = True, xticklabels = 20, yticklabels = 20)
ax.invert_yaxis()
我已经检查了很多答案和文档,我的最大问题是我缺乏经验,对matplotlib的理解非常差,而且文档感觉就像是另一种语言... 下面是我尝试过的方法。
尝试1:一个略微修改的 这个问题 的解决方案:
fmtr = tkr.StrMethodFormatter('{x:.0f}')
plt.gca().xaxis.set_major_formatter(fmtr)
我相信tkr.StrMethodFormatter()
会在我的轴字符串中遇到的每个值的第20个索引处显示该值,这可能是由于我在sns.heatmap()
中的设置导致的。我尝试了不同的字符串输入到tkr.StrMethodFormatter()
,但没有成功。我查看了另外两个问题,并尝试了此处和此处答案中使用的不同组合的tkr
类。
尝试2:
fmtr = tkr.StrMethodFormatter("{x:.0f}")
locator = tkr.MultipleLocator(50)
fstrform = tkr.FormatStrFormatter('%.0f')
plt.gca().xaxis.set_major_formatter(fmtr)
plt.gca().xaxis.set_major_locator(locator)
#plt.gca().xaxis.set_major_formatter(fstrform)
现在我完全不知所措了。 我发现locator
更改了要绘制的第n个索引,而fmtr
和fstrform
都更改了显示的小数位数,但是我怎么也无法让坐标轴显示存在于坐标轴列表中的整数值!
请帮帮我! 我已经苦苦挣扎了好几个小时。 这可能是简单的问题,谢谢!
另外:
有人能详细解释一下那个问题中的文档摘录吗? 具体来说:
...用于位置的字段必须标记为pos。
此外,有人能解释一下tkr.StrMethodFormatter("{x:.0f}")
和tkr.FormatStrFormatter('%.0f')
之间的区别吗? 我觉得很烦人,因为有两种方法,每种方法都有自己的语法,以产生相同的结果。
更新:
我花了一些时间来实现@ImportanceOfBeingErnest提供的解决方案。 我采取了额外的预防措施,并将x,y
数组中的数字四舍五入。 我不确定这是否必要,但我已经产生了想要的结果:
x = np.linspace(0, 15, 151)
y = np.linspace(0, 15, 151)
# round float numbers in axes arrays
x_rounded = [round(i,3) for i in x]
y_rounded = [round(i,3) for i in y]
#substitute random data for my_data
df_map = pd.DataFrame(my_data, index = y_rounded , columns = x_rounded)
plt.figure()
ax0 = sns.heatmap(df_map, square = True, xticklabels = 20)
ax0.invert_yaxis()
labels = [label.get_text() for label in ax0.get_xticklabels()]
ax0.set_xticklabels(map(lambda x: "{:g}".format(float(x)), labels))
虽然我仍不完全确定为什么这起作用了;可以查看我和他们之间的评论以获得更多澄清。
pos
,所以你也可以; 它在这里没有帮助。StrMethodFormatter("{x:.0f}")
与FormatStrFormatter('%.0f')
完全相同;使用哪个更容易理解就使用哪个。 - ImportanceOfBeingErnest