matplotlib fill_between ‘where’ arg считает, что параметры имеют разный размер (но это не так)

#python #matplotlib

#python #matplotlib

Вопрос:

учитывая:

 line1_xclip = [0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0]
line1_yclip = [10.0, 10.0, 5.0, 0.0, 0.0, 5.0, 10.0, 10.0, 5.0, 0.0, 0.0, 5.0, 10.0, 10.0]
line2_yclip = [0.0, 0.0, 5.0, 10.0, 10.0, 5.0, 0.0, 0.0, 5.0, 10.0, 10.0, 5.0, 0.0, 0.0]
 

когда я запускаю:

 ax.fill_between(line1_xclip, line1_yclip, line2_yclip, where=(line1_yclip<line2_yclip), color='b', interpolate=True, alpha=0.5)
ax.fill_between(line1_xclip, line1_yclip, line2_yclip, where=(line1_yclip>line2_yclip), color='r', interpolate=True, alpha=0.5)
 

Я получаю:

C:ProgramDataAnaconda3envspy37libsite-packagesipykernel_launcher.py:142 : MatplotlibDeprecationWarning: Начиная с 3.2, параметр where должен иметь тот же размер, что и [0.0 10.0 20.0 30.0 40.0 50.0 60.0 70.0 80.0 90.0 100.0 110.0 120.0 130.0] в fill_betweenx(). Это станет ошибкой двумя второстепенными выпусками позже.

C:ProgramDataAnaconda3envspy37libsite-packagesipykernel_launcher.py:143 : MatplotlibDeprecationWarning: Начиная с 3.2, параметр where должен иметь тот же размер, что и [0.0 10.0 20.0 30.0 40.0 50.0 60.0 70.0 80.0 90.0 100.0 110.0 120.0 130.0] в fill_betweenx(). Это станет ошибкой двумя второстепенными выпусками позже.

Тем не менее, если я проверю форму:

 print("line1_xclip shape = %s" % np.shape(line1_xclip))
print("line1_yclip shape = %s" % np.shape(line1_yclip))
print("line2_yclip shape = %s" % np.shape(line2_yclip))
 

line1_xclip shape = 14

line1_yclip shape = 14

line2_yclip shape = 14

кажется, все в порядке.

Процесс выполняется, но выдает:

одноцветный график вывода

Тот же код дал желаемые результаты с другими данными, например: обратная цветовая схема

Я использую Python 3.7.3, Numpy 1.16.4 и Matplotlib 3.3.1 в Jupyter Lab на компьютере с Windows 7-64.

Любые мысли с благодарностью.

Ответ №1:

Проблема заключалась в типе данных.

Я пытался передать списки в kwarg, которому нужны массивы.

РЕШАЕТСЯ:

 line1_xclip = np.array([0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0])
line1_yclip = np.array([10.0, 10.0, 5.0, 0.0, 0.0, 5.0, 10.0, 10.0, 5.0, 0.0, 0.0, 5.0, 10.0, 10.0])
line2_yclip = np.array([0.0, 0.0, 5.0, 10.0, 10.0, 5.0, 0.0, 0.0, 5.0, 10.0, 10.0, 5.0, 0.0, 0.0])
 

желаемая цветовая схема

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

1. Все четыре параметра (от x до where) будут принимать списки. Проблема заключалась в том, что сравнение списков дает скалярное логическое значение, в то время как сравнение массивов дает логический массив.