Установите расположение легенды вручную с помощью matplotlib и GetDistTool

#python #numpy #matplotlib #legend

#python #numpy #matplotlib #легенда

Вопрос:

Я пытаюсь вручную установить местоположение для основной легенды основного графика, созданного инструментом Getdist.

На графике ниже представлены уровни достоверности 1/2 сигмы, полученные из ковариационной матрицы с совместными распределениями. Он создается с помощью инструмента Getdist.

проблема с легендой

Инструмент Getdist tool позволяет указать расположение легенд: я пробовал с legend_loc = 'upper right' , но, как вы можете видеть, в верхней части рисунка есть перекрытие. Я хочу сдвинуть справа легенду, чтобы избежать этого перекрытия: возможно ли это? если да, то как?

Основная процедура, которая генерирует этот график, является :

 g.triangle_plot([matrix1, matrix2],
                  names,
                  filled = True,
                 legend_labels = ['Opt. Flat. No Gamma. - optimistic case - cross - standard situation - Criterion taking into accound a = 200', 'Pess. Flat. No Gamma. - pessimistic case - cross - standard situation - Criterion taking into account a = 300' ],
                  legend_loc = 'upper right',
                  contour_colors = ['darkblue','red'],
                  line_args = [{'lw':2, 'color':'darkblue'},
                  {'lw':2, 'color':'red'}]
                  )
  

Обновление 1

Мне не удается применить сдвиги в нижнем левом углу легенды, выполнив :

 g.triangle_plot([matrix1, matrix2],
                names,
                filled = True,               
                 legend_labels = ['Opt. Flat. No Gamma. - optimistic case - cross - standard situation - Criterion taking into accound a = 200', 'Pess. Flat. No Gamma. - pessimistic case - cross - standard situation - Criterion taking into account a = 300' ],
                legend_loc = 'center right',
                contour_colors = ['darkblue','red'],
                line_args = [{'lw':2, 'color':'darkblue'},
                {'lw':2, 'color':'red'}],                
                bbox_to_anchor = [0.1, 0.5]
                )
  

Как вы можете видеть, я попытался поместить легенду на 0.1 сверху и посередине.

Но, к сожалению, это ничего не меняет, я получаю с этими параметрами следующий график:

смещения не применяются

Вы можете заметить, что с этими параметрами простого сдвига к началу было бы достаточно, но для instant я не знаю, как это выполнить.

Я также пытался удалить loc и bbox_to_anchor из g.triangle_plot и попытаться сделать напрямую :

 g.fig.legend(loc='center right', bbox_to_anchor=[0.1, 0.1])
  

Но те же проблемы со смещением не применены на конечном рисунке.

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

1. Полезное замечание: на английском языке говорится «Я надеюсь, что проблема ясна», а не «Я надеюсь, что проблема ясна». Однако в Stack Overflow мы стремимся устранить проблему chatty — заявление о том, что вы надеетесь, что что-то понятно, не способствует его ясности, поэтому ожидается, что вы воздержитесь от подобных избыточных замечаний.

Ответ №1:

В вызываемой legend функции pyplot есть аргумент. bbox_to_anchor Это что-то вроде относительного отклонения, и я не совсем уверен, как это работает. Но в принципе вы можете установить там некоторые значения горизонтальных и вертикальных сдвигов, а затем настроить в соответствии с желаемой позицией.

Например, вы можете написать plt.legend(bbox_to_anchor=[2.32, 0.5], loc='center right')

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

1. Спасибо за ваш быстрый ответ. К сожалению, я пытался изменить значения для bbox_to_anchor , но это не приводит к каким-либо изменениям в расположении легенды.

2. Хм, это странно, потому что именно так я обычно настраиваю местоположение легенды. Возможно, это не работает с GetDist, я пытался использовать только в pyplot.

3. Действительно, это stange. Я думаю, это связано, возможно, с тем фактом, что основная подпрограмма ‘g.triangle_plot`, которая генерирует график, использует свой собственный параметр legend_loc parameter. Я должен добавить, что я определил g с помощью : g = plots.get_subplot_plotter() . Что вы думаете об этом?

4. Я просмотрел их код на github, и похоже, что они используют bbox_to_anchor параметр ( github.com/cmbant/getdist/blob/master/getdist/plots.py#L1872 ). И я также запустил некоторый код отсюда getdist.readthedocs.io/en/latest/plot_gallery.html , вставил туда bbox_to_anchor параметр в g.add_legend , и это полностью изменило положение легенды. Так что, возможно, вам следует вызвать g.add_legend функцию напрямую. Также попробуйте отправить bbox_to_anchor с некоторыми более высокими параметрами, такими как [2.1, 2.5]. Возможно, при небольших различиях в положении это не так заметно.

5. Ваше решение с g.add_legend работает, но теперь я столкнулся с другой проблемой: процедура g.trianglr_plot добавляет другую легенду, даже если я удалил legend_loc , bbox_to_anchor и большинство материалов, связанных с легендой в этой процедуре.