编程语言
首页 > 编程语言> > python – 创建相关的matplotlib散点图例大小

python – 创建相关的matplotlib散点图例大小

作者:互联网

我正在寻找一种方法来包含描述散点图中点的大小的(matplotlib)图例,因为这可能与另一个变量有关,就像在这个基本示例中一样:

import numpy as np
import matplotlib.pyplot as plt

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
a2 = 400*np.random.rand(N)

plt.scatter(x, y, s=a2, alpha=0.5)
plt.show()

(灵感来自:
http://matplotlib.org/examples/shapes_and_collections/scatter_demo.html)

所以在图例中,根据散射中的s描述符,理想情况下很少有与大小0-400(a2变量)对应的点.

解决方法:

下面的解决方案使用pandas将大小分组到集合箱中(使用groupby).它绘制每个组,并为标记分配标签和大小.我使用了this question的装箱配方.

请注意,这与您所述的问题略有不同,因为标记大小被分箱,这意味着a2中的两个元素(例如36和38)将具有与它们在相同分箱中相同的大小.您可以随时增加垃圾箱数量,使其更适合您.

使用此方法,您可以更改每个bin的其他参数,例如标记形状或颜色.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

N = 50
M = 5 # Number of bins

x = np.random.rand(N)
y = np.random.rand(N)
a2 = 400*np.random.rand(N)

# Create the DataFrame from your randomised data and bin it using groupby.
df = pd.DataFrame(data=dict(x=x, y=y, a2=a2))
bins = np.linspace(df.a2.min(), df.a2.max(), M)
grouped = df.groupby(np.digitize(df.a2, bins))

# Create some sizes and some labels.
sizes = [50*(i+1.) for i in range(M)]
labels = ['Tiny', 'Small', 'Medium', 'Large', 'Huge']

for i, (name, group) in enumerate(grouped):
    plt.scatter(group.x, group.y, s=sizes[i], alpha=0.5, label=labels[i])

plt.legend()
plt.show()

标签:scatter-plot,python,matplotlib,legend
来源: https://codeday.me/bug/20191004/1854477.html