Я получаю ошибку при попытке построить две отдельные строки в seaborn

#python #matplotlib #seaborn

Вопрос:

Я хочу написать две разные строки на тепловой карте. Мой код

 lines = [0,10,300,500,2560, 34500]
     with sns.axes_style("white"):
            f, ax = plt.subplots(figsize=(50, 50))
            ax = sns.heatmap(X)
            ax.axvline(4000, *ax.get_ylim(), ymin = lines[0], ymax = lines[4], lw = 8.0,  color = 'red')
            ax.axvline(4000, *ax.get_ylim(), ymin = lines[5], lw = 8.0,  color = 'green')
 

и я получаю сообщение об ошибке типа

 TypeError: axvline() got multiple values for argument 'ymin'.
 

Что это значит?

Ответ №1:

Согласно документации, axvline подпись,

 axvline(x=0, ymin=0, ymax=1, **kwargs)
 

поэтому, когда вы делаете

 ax.axvline(4000, *ax.get_ylim(), ymin = lines[0], ymax = lines[4],
 

get_ylim() возвращает 2-кортеж), вы передаете ymin и ymax дважды.

Вам нужно либо

  • не использовать *ax.get_ylim() или
  • не использовать ymin и ymax отдельно.

Комментарии:

1. Я понимаю. Но если мой диапазон оси y равен [0,1], я не могу построить красную линию между 0 и 500. Я хочу, чтобы мои оси были разделены в диапазоне, который я получаю от ax.get_ylim() , который равен [0, 34500].

2. Согласно документации, ymin и ymax всегда в диапазоне от 0 до 1, а не в вашем диапазоне данных.

Ответ №2:

Хорошо, есть обходной путь к вопросу. Комментатор выше упоминал, что ось y всегда должна принимать число от 0 до 1.

Таким образом, мы можем обойти проблему с процентами.

 lines = [0,10,300,500,2560, 34500]
p_1 = lines[4]/lines[-1]
p_2 = 1
     with sns.axes_style("white"):
            f, ax = plt.subplots(figsize=(50, 50))
            ax = sns.heatmap(X)
            ax.axvline(4000, *ax.get_ylim(), ymin = 1-p1, ymax = p2, lw = 8.0,  color = 'red')
            ax.axvline(4000, *ax.get_ylim(), ymin = 0,ymax = 1-p1, lw = 8.0,  color = 'green')