簡體   English   中英

如何在seaborn散點圖圖例中適應太大的點尺寸?

[英]How to adapt too large dot sizes in a seaborn scatterplot legend?

我用seaborn創建了一系列氣泡圖,除了圖例外,它看起來很好: 在此處輸入圖片說明

我使用以下命令來創建這個圖:

ax = sns.scatterplot(x='year', y='population', hue='Country', data=temp,
                     size="density", sizes=(1500, 5000), alpha=0.25, palette="muted")

如何從圖例中刪除 Country 並只保留密度? 文檔中沒有這樣的選項。 另外,如何近似氣泡中的值並使它們更明顯?

可運行代碼:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
temp = pd.DataFrame({'year': [1980, 1980, 1980, 1980, 1980], 'population': [2.87,2.95,3.45,4.18,4.67], 'Country': ['ALB','ARM'
,'URY','PAN','CAF'], 'density': [1.0,1.03,1.2,1.46,1.63] })

ax=sns.scatterplot(x='year', y='population', hue='Country', data=temp,size="density", sizes=(500, 1500), alpha=0.25, palette="muted" )    
ax.set_xlim(1950,2030)
for line in temp.index:
    ax.text(temp.year[line], temp.population[line], temp.Country[line], horizontalalignment='center', size='medium', color='black', weight='semibold')
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
ax.set_ylabel("")
ax.set_xlabel("")
ax.set_title("Population density in 5 closely populated countries")

ax.get_legend_handles_labels()獲取圖例的當前句柄和標簽。 這些只是列表,可以通過切片來縮短。 顯示尺寸的手柄太大而無法放入圖例中。 只需檢索尺寸,縮放它們並將它們放回原處。 (注意handles[i].get_sizes()返回一個列表,通常只有一個條目。)

標簽只是字符串。 如果需要,可以重新創建它們,例如使用不同的格式。 要更改顯示的位數,可以先將標簽轉換為浮點數,然后再轉換回字符串f{float(label):.2f}' (使用f 字符串進行格式化)。 請注意,第一個標簽是應該以不同方式處理的標題。

或者,可以擴展 ylimits,因為默認填充不考慮大的散點。 此外,文本可以垂直居中以更好地適應圓圈。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

temp = pd.DataFrame({'year': [1980, 1980, 1980, 1980, 1980],
                     'population': [2.87, 2.95, 3.45, 4.18, 4.67],
                     'Country': ['ALB', 'ARM', 'URY', 'PAN', 'CAF'],
                     'density': [1.0, 1.03, 1.2, 1.46, 1.63]})

ax = sns.scatterplot(x='year', y='population', hue='Country', data=temp,
                     size="density", sizes=(500, 1500), alpha=0.25, palette="muted")
ax.set_xlim(1950, 2030)
ylim0, ylim1 = ax.get_ylim()
ydelta = (ylim1 - ylim0) * 0.05
ax.set_ylim(ylim0 - ydelta, ylim1 + ydelta)
for line in temp.index:
    ax.text(temp.year[line], temp.population[line], temp.Country[line], ha='center', va='center', size='medium',
            color='black', weight='semibold')
handles, labels = ax.get_legend_handles_labels()
entries_to_skip = len(temp) + 1
handles = handles[entries_to_skip:]
labels = labels[entries_to_skip:]
for h in handles[1:]:
    sizes = [s / 10 for s in h.get_sizes()]
    h.set_sizes(sizes)
labels = labels[:1] + [f'{float(lab):.2f}' for lab in labels[1:]]
plt.legend(handles, labels, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
ax.set_ylabel("")
ax.set_xlabel("")

plt.tight_layout()
plt.show()

結果圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM