简体   繁体   English

如何在 matplotlib 中沿 x 轴稍微移动重叠数据点?

[英]How can I shift overlapping data points slightly along the x-axis in matplotlib?

I collected some data points for 4 different experimental setups, which are labeled "1", "2", "4" and "8".我收集了 4 个不同实验设置的一些数据点,标记为“1”、“2”、“4”和“8”。 For each experimental setup, I collected 10 data points.对于每个实验设置,我收集了 10 个数据点。

I am able to successfully plot these data points and draw an additional curve to show the average values for each setup.我能够成功绘制这些数据点并绘制一条附加曲线以显示每个设置的平均值。

However, I changed other settings in my experiments, and I can plot another figure like that.但是,我在实验中更改了其他设置,我可以绘制另一个类似的图形。 Now I hope to put everything in one single plot (2 sets of data points and two average curves), but everything look too crowded.现在我希望把所有东西都放在一个单一的图中(2 组数据点和两条平均曲线),但一切看起来都太拥挤了。 My script for plotting and the plot are like these:我的绘图脚本和情节是这样的:

from numpy import *
import math
import matplotlib.pyplot as plt
import numpy as np

raw_1 = [0.38, 0.49, 0.25, 0.3, 0.4, 0.19, 0.45, 0.93, 0.44, 0.65] 
raw_2 = [0.27, 0.39, 0.09, 0.75, 0.79, 0.77, 0.31, 0.05, 0.73, 0.7]
raw_4 = [0.2, 0.84, 0.83, 0.7, 0.86, 0.2, 0.37, 0.41, 0.72, 0.29]
raw_8 = [0.2, 0.71, 0.31, 0.63, 0.24, 0.07, 0.2, 0.89, 0.34, 0.92]
y = np.array([raw_1, raw_2, raw_4, raw_8])
y = np.transpose(y)
y_mean = [mean(raw_1), mean(raw_2), mean(raw_4), mean(raw_8)]
x = [1,2,4,8]
xx = range(len(x))
plt.plot(xx, y[0], 'rx') 
plt.plot(xx, y[1], 'rx') 
plt.plot(xx, y[2], 'rx') 
plt.plot(xx, y[3], 'rx') 
plt.plot(xx, y[4], 'rx') 
plt.plot(xx, y[5], 'rx') 
plt.plot(xx, y[6], 'rx') 
plt.plot(xx, y[7], 'rx') 
plt.plot(xx, y[8], 'rx') 
plt.plot(xx, y[9], 'rx')

plt.xticks(xx,x)
leg = plt.legend(loc='upper left');

new_raw_1 = [0.217, 0.206, 0.222, 0.271, 0.212, 0.58, 0.333, 0.463, 0.314, 0.59] 
new_raw_2 = [0.511, 0.537, 0.565, 0.597, 0.527, 0.571, 0.505, 0.541, 0.542, 0.517]
new_raw_4 = [0.662, 0.552, 0.772, 0.436, 0.505, 0.577, 0.313, 0.796, 0.582, 0.574]
new_raw_8 = [0.511, 0.587, 0.591, 0.531, 0.522, 0.549, 0.593, 0.544, 0.552, 0.555]
y = np.array([new_raw_1, new_raw_2, new_raw_4, new_raw_8])
y = np.transpose(y)
y_mean_new = [mean(new_raw_1), mean(new_raw_2), mean(new_raw_4), mean(new_raw_8)]
x = [1,2,4,8]
xx = range(len(x))
plt.plot(xx, y[0], 'bo') 
plt.plot(xx, y[1], 'bo') 
plt.plot(xx, y[2], 'bo') 
plt.plot(xx, y[3], 'bo') 
plt.plot(xx, y[4], 'bo') 
plt.plot(xx, y[5], 'bo') 
plt.plot(xx, y[6], 'bo') 
plt.plot(xx, y[7], 'bo') 
plt.plot(xx, y[8], 'bo') 
plt.plot(xx, y[9], 'bo')
plt.plot(xx, y_mean_new, color='C0', marker='D', markersize=10, markerfacecolor='white', label='Avg A')
plt.plot(xx, y_mean, color='C1', marker='H', markersize=10, markerfacecolor='white', label='Avg B')
#plt.xticks(xx,x)
leg = plt.legend();


plt.show()

在此处输入图片说明

Currently, the blue circles and the red X markers are blocking each other.目前,蓝色圆圈和红色 X 标记相互阻挡。 How should I modify my script to introduce a small x-axis shift between blue circles and red X markers, while still keeping xticks as "1", "2", "4", "8" with equal distances?我应该如何修改我的脚本以在蓝色圆圈和红色 X 标记之间引入一个小的 x 轴偏移,同时仍然保持 xticks 为“1”、“2”、“4”、“8”等距离?

You can add an offset to the x positions simply by defining a different list of x coordinates for each series.您可以通过为每个系列定义不同的 x 坐标列表来为 x 位置添加偏移量。 This doesn't affect your ticks as you simply keep the original x positions for them.这不会影响您的刻度,因为您只需为它们保留原始 x 位置。 Here's an example:下面是一个例子:

from numpy import *
import math
import matplotlib.pyplot as plt
import numpy as np

raw_1 = [0.38, 0.49, 0.25, 0.3, 0.4, 0.19, 0.45, 0.93, 0.44, 0.65] 
raw_2 = [0.27, 0.39, 0.09, 0.75, 0.79, 0.77, 0.31, 0.05, 0.73, 0.7]
raw_4 = [0.2, 0.84, 0.83, 0.7, 0.86, 0.2, 0.37, 0.41, 0.72, 0.29]
raw_8 = [0.2, 0.71, 0.31, 0.63, 0.24, 0.07, 0.2, 0.89, 0.34, 0.92]
y = np.array([raw_1, raw_2, raw_4, raw_8])
y = np.transpose(y)
y_mean = [mean(raw_1), mean(raw_2), mean(raw_4), mean(raw_8)]
x = [1,2,4,8]
xx = range(len(x))
xxr = [x - 0.1 for x in xx]
plt.plot(xxr, y[0], 'rx')
plt.plot(xxr, y[1], 'rx')
plt.plot(xxr, y[2], 'rx')
plt.plot(xxr, y[3], 'rx')
plt.plot(xxr, y[4], 'rx')
plt.plot(xxr, y[5], 'rx')
plt.plot(xxr, y[6], 'rx')
plt.plot(xxr, y[7], 'rx')
plt.plot(xxr, y[8], 'rx')
plt.plot(xxr, y[9], 'rx')

plt.xticks(xx,x)
leg = plt.legend(loc='upper left');

new_raw_1 = [0.217, 0.206, 0.222, 0.271, 0.212, 0.58, 0.333, 0.463, 0.314, 0.59] 
new_raw_2 = [0.511, 0.537, 0.565, 0.597, 0.527, 0.571, 0.505, 0.541, 0.542, 0.517]
new_raw_4 = [0.662, 0.552, 0.772, 0.436, 0.505, 0.577, 0.313, 0.796, 0.582, 0.574]
new_raw_8 = [0.511, 0.587, 0.591, 0.531, 0.522, 0.549, 0.593, 0.544, 0.552, 0.555]
y = np.array([new_raw_1, new_raw_2, new_raw_4, new_raw_8])
y = np.transpose(y)
y_mean_new = [mean(new_raw_1), mean(new_raw_2), mean(new_raw_4), mean(new_raw_8)]
x = [1,2,4,8]
xx = range(len(x))
xxb = [x + 0.1 for x in xx]
plt.plot(xxb, y[0], 'bo')
plt.plot(xxb, y[1], 'bo')
plt.plot(xxb, y[2], 'bo')
plt.plot(xxb, y[3], 'bo')
plt.plot(xxb, y[4], 'bo')
plt.plot(xxb, y[5], 'bo')
plt.plot(xxb, y[6], 'bo')
plt.plot(xxb, y[7], 'bo')
plt.plot(xxb, y[8], 'bo')
plt.plot(xxb, y[9], 'bo')
plt.plot(xx, y_mean_new, color='C0', marker='D', markersize=10, markerfacecolor='white', label='Avg A')
plt.plot(xx, y_mean, color='C1', marker='H', markersize=10, markerfacecolor='white', label='Avg B')
#plt.xticks(xx,x)
leg = plt.legend()

You could also improve the code a bit by removing duplications (particularly the duplicated import of numpy) and using loops to save repeating yourself:您还可以通过删除重复项(尤其是 numpy 的重复导入)并使用循环来避免重复来稍微改进代码:

I've also used unique variable names inside the comprehensions in this version as I think the reuse of x might cause problems in Python 2.7.我还在这个版本的推导式中使用了唯一的变量名,因为我认为 x 的重用可能会导致 Python 2.7 中的问题。

import matplotlib.pyplot as plt
import numpy as np

raw_1 = [0.38, 0.49, 0.25, 0.3, 0.4, 0.19, 0.45, 0.93, 0.44, 0.65] 
raw_2 = [0.27, 0.39, 0.09, 0.75, 0.79, 0.77, 0.31, 0.05, 0.73, 0.7]
raw_4 = [0.2, 0.84, 0.83, 0.7, 0.86, 0.2, 0.37, 0.41, 0.72, 0.29]
raw_8 = [0.2, 0.71, 0.31, 0.63, 0.24, 0.07, 0.2, 0.89, 0.34, 0.92]
y = np.array([raw_1, raw_2, raw_4, raw_8])
y = np.transpose(y)
y_mean = [np.mean(raw_1), np.mean(raw_2), np.mean(raw_4), np.mean(raw_8)]
x = [1,2,4,8]
xx = range(len(x))

xxr = [j - 0.1 for j in xx]
for point in y:
    plt.plot(xxr, point, 'rx')

plt.xticks(xx,x)
leg = plt.legend(loc='upper left');

new_raw_1 = [0.217, 0.206, 0.222, 0.271, 0.212, 0.58, 0.333, 0.463, 0.314, 0.59] 
new_raw_2 = [0.511, 0.537, 0.565, 0.597, 0.527, 0.571, 0.505, 0.541, 0.542, 0.517]
new_raw_4 = [0.662, 0.552, 0.772, 0.436, 0.505, 0.577, 0.313, 0.796, 0.582, 0.574]
new_raw_8 = [0.511, 0.587, 0.591, 0.531, 0.522, 0.549, 0.593, 0.544, 0.552, 0.555]
y = np.array([new_raw_1, new_raw_2, new_raw_4, new_raw_8])
y = np.transpose(y)
y_mean_new = [np.mean(new_raw_1), np.mean(new_raw_2), np.mean(new_raw_4), np.mean(new_raw_8)]

xxb = [k + 0.1 for k in xx]
for point in y:
    plt.plot(xxb, point, 'bo')

plt.plot(xx, y_mean_new, color='C0', marker='D', markersize=10, markerfacecolor='white', label='Avg A')
plt.plot(xx, y_mean, color='C1', marker='H', markersize=10, markerfacecolor='white', label='Avg B')

leg = plt.legend()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM