我将pandas数据框绘制到seaborn热图中,我想为特定位置设置特定的y轴刻度。
我的数据帧索引是100行,对应于"深度"参数,但此索引中的值没有以良好的间隔排列: 我想将刻度标签设置为100的倍数。我可以使用以下方法做到这一点:
yticks = np.linspace(10,100,10)
ylabels = np.linspace(100,1000,10)
对于我的数据帧有100行,其值大约为100 - 1000,但结果显然不可取,因为刻度标签的位置显然与正确的深度值不对应(索引值< / em>),只有索引中的位置。
如何生成图表扭曲的热图,以便实际深度值(索引值)与我设置的ylabels对齐?
对此的一个复杂因素还在于索引值不是线性采样的......
答案 0 :(得分:2)
在使用seaborn进行绘图时,您必须为heatmap函数指定参数xticklabels
和yticklabels
。在你的情况下,这些参数必须是带有自定义刻度标签的列表。
答案 1 :(得分:2)
我的解决方案有点难看,但它对我有用。假设您的深度数据位于depth_list
,num_ticks
是您想要的刻度数:
num_ticks = 10
# the index of the position of yticks
yticks = np.linspace(0, len(depth_list) - 1, num_ticks, dtype=np.int)
# the content of labels of these yticks
yticklabels = [depth_list[idx] for idx in yticks]
然后以这种方式绘制热图(您的数据位于data
中):
ax = sns.heatmap(data, yticklabels=yticklabels)
ax.set_yticks(yticks)
plt.show()
答案 2 :(得分:0)
我开发了一种解决方案,可以按照我的意图进行,并在liwt31的解决方案之后进行了修改:
def round(n, k):
# function to round number 'n' up/down to nearest 'k'
# use positive k to round up
# use negative k to round down
return n - n % k
# note: the df.index is a series of elevation values
tick_step = 25
tick_min = int(round(data.index.min(), (-1 * tick_step))) # round down
tick_max = (int(round(data.index.max(), (1 * tick_step)))) + tick_step # round up
# the depth values for the tick labels
# I want my y tick labels to refer to these elevations,
# but with min and max values being a multiple of 25.
yticklabels = range(tick_min, tick_max, tick_step)
# the index position of the tick labels
yticks = []
for label in yticklabels:
idx_pos = df.index.get_loc(label)
yticks.append(idx_pos)
cmap = sns.color_palette("coolwarm", 128)
plt.figure(figsize=(30, 10))
ax1 = sns.heatmap(df, annot=False, cmap=cmap, yticklabels=yticklabels)
ax1.set_yticks(yticks)
plt.show()