#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')