如何解决Matplotlib散点图标记随纵坐标增大而变大的问题
Stepmania解析器散点图标记大小异常问题解决
你在编写Stepmania解析器生成散点图时,遇到标记随纵坐标上移变大的问题,设置markersize参数也没效果,核心问题和解决方法如下:
问题根源
看你的ScatterTime函数代码:
plt.scatter(ind, fullrange, s=beats, marker = ".",)
这里有两个关键错误:
- 散点大小被动态赋值:
s是控制散点大小的参数,你传入的beats数组值随beat +=1不断递增,纵坐标越靠上(fullrange数值越大),对应的beats值也越大,直接导致标记大小跟着变大。而markersize是折线图等其他绘图类型的标记参数,对散点图不生效。 - 绘图代码放在循环内:每次处理一行数据就调用一次
plt.scatter,会重复绘制图层,加重视觉上的大小混乱。
修复代码
修改后的ScatterTime函数:
def ScatterTime(): fpath = openSmFile() if (fpath.endswith('.sm')): file = open(fpath, "r") lines = file.readlines() beats = [] arrowDirections = [] beat = 1 for line in lines: i = 0 if not ("," in line or "." in line or "#" in line or ";" in line or "-" in line or line == "" or ":" in line or len(line) != 5): for alpha in line: if i == 0: arrowDirections.append("left") if i == 1: arrowDirections.append("down") if i == 2: arrowDirections.append("up") if i == 3: arrowDirections.append("right") i += 1 if i != 5: if (alpha != "0"): beats.append(beat) if (alpha == "0"): beats.append(0) beat += 1 # 把绘图逻辑移到循环外,只绘制一次 plt.title(str(os.path.basename(fpath))) fullrange = list(range(1, beat)) u, ind = np.unique(arrowDirections, return_inverse=True) plt.xticks(range(len(u)), u) # 用固定数值设置散点大小,比如s=10,可根据需求调整 plt.scatter(ind, fullrange, s=10, marker=".") else: print("该文件无效。")
说明
- 把
s=beats改成固定数值(比如s=10),所有散点大小就会统一,不会随纵坐标变化。 - 将绘图代码移出循环,避免重复叠加绘图,保证图表渲染正确。
内容的提问来源于stack exchange,提问作者user19642567
相关产品推荐
相关产品推荐

