如何为每个数组的散点设置delta x偏移?保持最后一组居中
实现散点图分组的差异化偏移效果
我来帮你搞定这个散点图分组偏移的需求!核心思路是给每个分组分配专属的x轴偏移量,让q组保持居中,a-h组向左依次偏移,i-p组向右依次偏移,每组偏移量不同来避免点的重叠,让图表更清晰。
具体实现步骤
- 定义分组偏移量:根据17个分组的顺序,创建一个偏移数组。
q(最后一个分组)偏移量为0;a-h使用递减的负偏移(越靠近q偏移越小);i-p使用递增的正偏移(越远离q偏移越大),这样视觉上会呈现对称分布,q在中间位置。 - 调整散点x坐标:在绘制散点时,给原始的x值加上对应分组的偏移量,实现位置偏移。
- 优化代码效率:简化月份数组的生成逻辑,避免不必要的循环。
修改后的完整代码
import matplotlib.cm as cm import matplotlib import matplotlib.pyplot as plt import numpy as np fig, ax0 = plt.subplots(nrows=1, ncols=1) months = np.arange(1, 13) # 简化months_expanded的生成:直接把每个月重复17次,再转成(12,17)的形状 months_expanded = np.tile(months.reshape(-1, 1), (1, 17)) M = np.random.rand(12, 17) M1 = np.random.rand(12, 17) datalist = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q'] # 定义每个分组的偏移量:共17个分组 # a-h(前8个):从-0.4到-0.05,步长0.05,递减的负偏移 left_offsets = np.linspace(-0.4, -0.05, 8) # i-p(中间8个):从0.05到0.4,步长0.05,递增的正偏移 right_offsets = np.linspace(0.05, 0.4, 8) # q(最后1个):偏移0 offsets = np.concatenate([left_offsets, right_offsets, [0]]) difference = abs(M - M1) for idx, sub in enumerate(datalist): # 给x坐标加上当前分组的偏移量 x = months_expanded[:, idx] + offsets[idx] ax0.scatter(x, difference[:, idx], label=sub) # 设置颜色映射 colormap = plt.cm.gist_ncar colorst = [colormap(i) for i in np.linspace(0, 0.9, len(ax0.collections))] for t, j1 in enumerate(ax0.collections): j1.set_color(colorst[t]) # 图表样式设置 ax0.legend(loc='center left', bbox_to_anchor=(1, 0.5)) ax0.yaxis.grid(True) ax0.xaxis.grid(True) matplotlib.rcParams.update({'font.size': 30}) fig.set_size_inches(20, 20) # 保存图片(记得替换成你的输出路径) # fig.savefig(outfile, bbox_inches='tight') plt.show()
关键细节说明
- 偏移量调整:如果你觉得偏移的范围不合适,可以修改
linspace里的起始和结束值,比如把-0.4改成-0.3来缩小左偏的幅度,或者调整步长让偏移量的差异更明显。 - x轴刻度:如果需要让x轴刻度依然显示1-12的整数,可以不用调整刻度,因为偏移后的点只是在刻度附近,不影响刻度的可读性。
- 颜色映射:保留了你原来的
gist_ncar配色,确保每个分组的颜色依然不同。
内容的提问来源于stack exchange,提问作者PEBKAC
相关产品推荐
相关产品推荐

