Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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
Python 在matplotlib轴/图上绘制:获取yticklabel单个位置并将其用于绘制线_Python_Matplotlib_Heatmap - Fatal编程技术网

Python 在matplotlib轴/图上绘制:获取yticklabel单个位置并将其用于绘制线

Python 在matplotlib轴/图上绘制:获取yticklabel单个位置并将其用于绘制线,python,matplotlib,heatmap,Python,Matplotlib,Heatmap,我想知道,如果有人谁主宰更先进的matplotlib可以帮助我在这一点上。我有一张热图,可以用以下代码模拟: import numpy as np import string from matplotlib import pylab as plt def random_letter(chars=string.ascii_uppercase, size=2): char_arr = np.array(list(chars)) if size > 27: si

我想知道,如果有人谁主宰更先进的matplotlib可以帮助我在这一点上。我有一张热图,可以用以下代码模拟:

import numpy as np
import string
from matplotlib import pylab as plt

def random_letter(chars=string.ascii_uppercase, size=2):
    char_arr = np.array(list(chars))
    if size > 27:
        size = 27
    np.random.shuffle(char_arr)
    return char_arr[:size]

data = np.random.poisson(1, (174, 40))

y_labels = [', '.join(x for x in random_letter()) for _ in range(174)]
y_labels = sorted(y_labels)

fig, ax = plt.subplots()
fig.set_size_inches(11.7, 16.5)

heatmap = ax.pcolor(data, 
                    cmap=plt.cm.Blues, 
                    vmin=data.min(), 
                    vmax=data.max(), 
                    edgecolors='white')
ax.set_xticks(np.arange(data.shape[1])+.5, minor=False);
ax.set_yticks(np.arange(data.shape[0])+.5, minor=False);
ax.set_xticklabels(np.arange(40), rotation=90);
ax.set_yticklabels(y_labels, fontsize=5);
cb = fig.colorbar(heatmap, shrink=0.33, aspect=10)
我需要在热图上画线,在YtickSlabel上分离特征,如下图所示(我用手画):


有人知道如何通过编程方式编写matplotlib来实现这一点吗

我将冒昧地为@tcaswell编写完整的解决方案,实际上只需再写7行:

xl, xh=ax.get_xlim()
left=xl-(xh-xl)*0.1 #10% extension on each side
right=xh+(xh-xl)*0.1
Lines=ax.hlines([5,10,15,20], left, right, color='r', linewidth=1.2)
Lines.set_clip_on(False)
ax.set_xlim((xl, xh))

我不清楚如何推导水平线的y值;那些与Ytick有关吗?我想axhline会做你想做的事。
hline
+
clip\u on=False
(对不起,没有时间写一个更完整的答案)@tilsten
axhline
非常聪明,设置了轴分数单位的限制,所以它不能做边缘部分。是的,但是,谁来检测特定标签完成的位置呢?这是主要问题。yticklabel_pos=比如ax.yaxis.get_label_position()这实际上是最简单的部分,只需将
[5,10,15,20]
替换为
[i for i,v in enumerate(y_labels),如果v in[a list of the_TICK_labels\u YOU想在其上划线]