使用热图将线图与双轴图上的xticks对齐

时间:2018-10-12 14:04:06

标签: python matplotlib seaborn

我正在尝试在双轴图上绘制折线图和热图。这就是我得到的:

enter image description here

如您所见,由于存在将xticks居中的热图,因此折线图未与xticks对齐。如何将线图向右移动0.5,以使线图上的数据点正确对应于xticks?

下面是我的代码:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

data1 = np.random.random((10, 10))
data2 = np.random.random((10))

f, ax = plt.subplots(figsize=(11, 9))
plt.tick_params(bottom='on')
ax = sns.heatmap(data1, cmap=sns.color_palette("Greens", 5))
ax2 = plt.twinx()
sns.lineplot(data=data2, linewidth=5, ax=ax2)
ax.axis('tight')

plt.show()

2 个答案:

答案 0 :(得分:3)

以下是完成此操作的一种方法。

说明:双轴实例ax2仅使用sns.lineplot绘制了一条线。您首先提取该line对象。然后,您只需要根据需要0.5向右更新(移动)该行的x数据。 line.get_xdata()返回一个x值数组,您只需以向量化的方式添加0.5,然后使用line.set_xdata应用更改。在sns.lineplot()命令后添加以下行。

line = ax2.lines[0] # get the line
line.set_xdata(line.get_xdata() + 0.5)

enter image description here

答案 1 :(得分:2)

问题不是线图,而是热图,它在错误的位置显示刻度线[*]。您可以直接使用matplotlib imshow图,这样一切都可以正常工作。

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

data1 = np.random.random((10, 10))
data2 = np.random.random((10))

f, ax = plt.subplots(figsize=(11, 9))
plt.tick_params(bottom='on')

im = ax.imshow(data1, cmap=plt.get_cmap("Greens",5), aspect="auto")
f.colorbar(im)

ax2 = plt.twinx()
sns.lineplot(data=data2, linewidth=5, ax=ax2)
ax.axis('tight')

plt.show()

enter image description here


[*]“错误位置”是指刻度线未出现在它们似乎标记的轴上的位置。即报价的数据单位与标签中显示的值不同。

如果将热图绘制到ax,则打印

print(*ax.get_xticklabels())

结果

Text(0.5, 0, '0') Text(1.5, 0, '1') Text(2.5, 0, '2') Text(3.5, 0, '3') Text(4.5, 0, '4') Text(5.5, 0, '5') Text(6.5, 0, '6') Text(7.5, 0, '7') Text(8.5, 0, '8') Text(9.5, 0, '9')

在这里您可以看到第一个刻度标签位于x=0.5处,但显示'0'作为标签。即与标签相比,所有位置都移位了0.5。

对于imshow图,(绘制图后,f.canvas.draw()),打印的标签为

Text(-2.0, 0, '-2') Text(0.0, 0, '0') Text(2.0, 0, '2') Text(4.0, 0, '4') Text(6.0, 0, '6') Text(8.0, 0, '8') Text(10.0, 0, '10')

此处的标签和位置一致。