Как я могу расположить элементы условных обозначений с переменным интервалом и чтобы цвета маркеров условных обозначений отражали цветовую карту

#python #matplotlib

Вопрос:

Я хотел бы, чтобы расстояние между элементами легенды увеличивалось вместо одного значения ( labelspacing ). Последний принимает только int тип значения, но мне нужен переменный интервал между элементами легенды. Кроме того, я хочу markerfacecolor , чтобы цветовая карта соответствовала цветовой карте, используемой при создании точечной диаграммы.

 N = 45
x, y = np.random.rand(2, N)

s = np.random.randint(10, 1000, size=N)

fig, ax = plt.subplots()

scatter = ax.scatter(x, y, c=s, s=s)

cbar = fig.colorbar(scatter,
             ax=ax,                                               
            label='Size',                                    
            fraction=0.1,                                      
            pad=0.04)

# produce a legend with a cross section of sizes from the scatter
handles, labels = scatter.legend_elements(prop="sizes", alpha=0.6)

for hd  in handles:
    hd.set_markeredgewidth(2)
    hd.set_markeredgecolor("red")
    hd.set_markerfacecolor('blue')
    
legend2 = ax.legend(
    handles[::2], labels[::2], loc="upper right", title="Sizes", labelspacing=1.2
)
  
plt.show() 
 

Я искал StackOverflow и попробовал некоторые возможные методы, но безуспешно. Может ли кто-нибудь подсказать, как я могу достичь желаемого результата?

введите описание изображения здесь

Ответ №1:

Мне удалось установить markerfacecolor в качестве цветовой карты. Но я все еще борюсь с переменной labelspacing !.

Любая помощь!

 N = 45
x, y = np.random.rand(2, N)

s = np.random.randint(10, 1000, size=N)

fig, ax = plt.subplots()

scatter = ax.scatter(x, y, c=s, s=s)

cbar = fig.colorbar(scatter,
             ax=ax,                                               
            label='Size',                                    
            fraction=0.1,                                      
            pad=0.04)

# produce a legend with a cross section of sizes from the scatter
handles, labels = scatter.legend_elements(prop="sizes", alpha=0.6)

leg_colrs = [color.get_markerfacecolor() for color in scatter.legend_elements()[0]]

for hd, color  in zip(handles, leg_colrs):
    hd.set_markeredgewidth(2)
    hd.set_markeredgecolor("red")
    hd.set_markerfacecolor(color)
    
legend2 = ax.legend(
    handles[::2], labels[::2], loc="upper right", title="Sizes", labelspacing=1.2
)
  
plt.show()