Как было указано, имеет ли это смысл немного зависит от вашего набора данных. Если у вас есть достаточно дискретные точки и точные совпадения имеют смысл, вы можете сделать что-то вроде этого:
import numpy as np
import matplotlib.pyplot as plt
test_x=[2,3,4,1,2,4,2]
test_y=[1,2,1,3,1,1,1] # I am just generating some test x and y values. Use your data here
#Generate a list of unique points
points=list(set(zip(test_x,test_y)))
#Generate a list of point counts
count=[len([x for x,y in zip(test_x,test_y) if x==p[0] and y==p[1]]) for p in points]
#Now for the plotting:
plot_x=[i[0] for i in points]
plot_y=[i[1] for i in points]
count=np.array(count)
plt.scatter(plot_x,plot_y,c=count,s=100*count**0.5,cmap='Spectral_r')
plt.colorbar()
plt.show()
Примечание: Вам нужно будет регулировать радиус (значение 100
в го s
аргумента) в соответствии с вашей плотности точек. Я также использовал квадратный корень счетчика, чтобы масштабировать его так, чтобы площадь точки была пропорциональна числу.
Также обратите внимание: если у вас очень плотные точки, возможно, было бы более целесообразно использовать другой вид сюжета. Гистограммы, например (мне лично нравится hexbin
для данных 2d), являются достойной альтернативой в этих случаях.
Что вам не нравится в использовании альфы? Недостатком других подходов, которые вы предлагаете, является то, что они полагаются на подсчет точно равных значений. Но у вас может быть много * почти * равных значений, которые перекрываются на участке рассеяния. Любой подход, который включает подсчет отдельных значений, не улучшит сюжет, а использует альфа-волю, поскольку частично перекрывающиеся точки будут по-прежнему приводить к потемнению. – BrenBarn