python 如何自定义以观测值数作为标签的散点图图例

iih3973s  于 2023-04-28  发布在  Python
关注(0)|答案(2)|浏览(124)

我想在图外添加一个文本框,其中我只是说正值或负值的数量。每种类型的文本必须与图中的数据具有相同的颜色,因此对于正文本必须为红色,对于负文本必须为蓝色。
下面是我写的代码:

text_plot = (f"number of positive neta : {nb_pos_neta}\nnumber of negative neta : {nb_neg_neta}")

fig, ax = plt.subplots(figsize =(10,7))
ax.scatter(time_det, neta, c = np.sign(neta), cmap="bwr", s=4, label='Rapport of polarisation')
plt.title('Evolution of rapport of polarisation - Aluminium')
plt.xlabel('Time [min]')
plt.ylabel('Rapport [-]')
plt.figtext(1.05, 0.5, text_plot, ha="right", fontsize=10, bbox={"facecolor":"white","alpha":0.5, "pad":5})
plt.tight_layout()
plt.savefig("Evolution of rapport of polarisation - (Aluminium).png")
plt.show()

结果是这样的:

vzgqcmou

vzgqcmou1#

这里的技巧是使用matplotlib的补丁来获取自定义图例。因为我需要生成一些假数据来让事情看起来很接近(并且不想深入研究像neta和time_det这样的东西,因为它们不是你的问题的核心),所以我使用numpy的wheresize进行了重构,用于着色和计数点。

import random
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

# generate some fake data of a similar range
x = np.random.random(100)*3000
y = np.random.random(100)*1

count_red = np.size(np.where(np.reshape(y,-1) >= .5))
count_blue = np.size(np.where(np.reshape(y,-1)< .5))

col = np.where(x<0,'k',np.where(y<.5,'b','r'))

fig, ax = plt.subplots(figsize =(10,7))

red_patch = mpatches.Patch(color='red', label=count_red)
blue_patch = mpatches.Patch(color='blue', label=count_blue)

dist_off_right_spline = .95
dist_from_top_spline  = .6

plt.title('Evolution of rapport of polarisation - Aluminium')
plt.xlabel('Time [min]')
plt.ylabel('Rapport [-]')
plt.tight_layout()
plt.savefig("Evolution of rapport of polarisation - (Aluminium).png")

plt.legend(bbox_to_anchor=(dist_off_right_spline, dist_from_top_spline), 
           loc='upper left', handles=[red_patch, blue_patch])

plt.scatter(x, y, c=col, s=5, linewidth=1)
plt.show()

这样(减去y轴范围)得到的图像与您指定的图像非常接近。

yzuktlbb

yzuktlbb2#

为什么不使用标准选择和标签?

x = np.arange(100)
y = np.random.randn(100)
fig, ax = plt.subplots()
ax.plot(x[y>=0], y[y>=0], 'r.', ls='none', label=f"≥0: {len(y[y>=0])}")
ax.plot(x[y<0], y[y<0], 'b.', ls='none', label=f"<0: {len(y[y<0])}")
ax.legend()

相关问题