Matplotlib:非随机抖动
Matplotlib: Non-random jitter
我已经阅读了问题 Matplotlib: avoiding overlapping datapoints in a "scatter/dot/beeswarm" plot and the question 但是我想生成像这些用 R 生成的图:
Here 是用于这些数字的代码。
我想用 matplotlib 来做,但到目前为止我只设法使用 np.random.normal(i, 0.05)
。这些点彼此分开,但我想订购它们。
This answer 做的事情与我想要的类似,但我的数据是非常接近但不同的浮点数,因此 groupby
函数不起作用,我想要如上图所示用 R 生成的图中所示的与中心对称的点。
正如这个问题 Edit 中指出的那样 Matplotlib: avoiding overlapping datapoints in a "scatter/dot/beeswarm" plot 并且我一开始没有阅读,有一个 python 包用于那种地块:
https://github.com/mgymrek/pybeeswarm
而且这个包肯定比下面的代码做得更好。
我修改了 this answer 的代码以接受浮点数,我得到的结果与我想要的略有相似。这是代码:
CA = [0,4,0,3,0,5]
CB = [0,0,4,4,2,2,2,2,3,0,5]
CC = [0.08423, 4.0078, 0.02936, 0.04862, 3.2105, 3.7796, 1.9974, 1.6986, 1.7443, 1.6615, 1, 1, 1]
lists = [CA, CB, CC]
x = []
y = []
for index1, my_list in enumerate(lists):
scores_bins = {}
for index2, score in enumerate(my_list):
binx = round(score, 1)
if binx not in scores_bins:
scores_bins[binx] = []
scores_bins[binx].append(score)
for key, val in sorted(scores_bins.items()):
values = scores_bins[key]
points = len(values)
pos = 1 + index1 + (1 - points) / 50.
for value in values:
x.append(pos)
y.append(value)
pos += 0.05
plt.plot(x, y, 'o')
plt.xlim((0,4))
plt.ylim((-1,6))
plt.show()
但是,如果 pos 增加,点将更多地向右移动,而不是仅仅从中心向右和向左扩散...
我已经阅读了问题 Matplotlib: avoiding overlapping datapoints in a "scatter/dot/beeswarm" plot and the question
Here 是用于这些数字的代码。
我想用 matplotlib 来做,但到目前为止我只设法使用 np.random.normal(i, 0.05)
。这些点彼此分开,但我想订购它们。
This answer 做的事情与我想要的类似,但我的数据是非常接近但不同的浮点数,因此 groupby
函数不起作用,我想要如上图所示用 R 生成的图中所示的与中心对称的点。
正如这个问题 Edit 中指出的那样 Matplotlib: avoiding overlapping datapoints in a "scatter/dot/beeswarm" plot 并且我一开始没有阅读,有一个 python 包用于那种地块:
https://github.com/mgymrek/pybeeswarm
而且这个包肯定比下面的代码做得更好。
我修改了 this answer 的代码以接受浮点数,我得到的结果与我想要的略有相似。这是代码:
CA = [0,4,0,3,0,5]
CB = [0,0,4,4,2,2,2,2,3,0,5]
CC = [0.08423, 4.0078, 0.02936, 0.04862, 3.2105, 3.7796, 1.9974, 1.6986, 1.7443, 1.6615, 1, 1, 1]
lists = [CA, CB, CC]
x = []
y = []
for index1, my_list in enumerate(lists):
scores_bins = {}
for index2, score in enumerate(my_list):
binx = round(score, 1)
if binx not in scores_bins:
scores_bins[binx] = []
scores_bins[binx].append(score)
for key, val in sorted(scores_bins.items()):
values = scores_bins[key]
points = len(values)
pos = 1 + index1 + (1 - points) / 50.
for value in values:
x.append(pos)
y.append(value)
pos += 0.05
plt.plot(x, y, 'o')
plt.xlim((0,4))
plt.ylim((-1,6))
plt.show()
但是,如果 pos 增加,点将更多地向右移动,而不是仅仅从中心向右和向左扩散...