如何去除Matplotlib散点图中方形标记的圆角边缘?
关于Matplotlib散点图方形标记圆角的问题
先贴出你用到的代码:
import matplotlib.pyplot as plt import numpy as np plt.figure(figsize=(3,2),dpi=1000) i = np.arange(1,100) x = i * 3.1426 / np.max(i) y = np.sin(x) s = 1/i print(s) plt.scatter(x/10,y, marker='s', s=s) plt.show()
你观察到的方形标记带圆角、小尺寸近似圆形的情况,确实是Matplotlib的默认预期效果。原因是Matplotlib为了让小标记在视觉上更平滑,默认会对标记应用抗锯齿处理,同时给方形这类带直角的标记添加轻微的圆角——当标记尺寸极小的时候,这个圆角的占比会变得很大,看起来就像圆形了。
想要让所有尺寸的标记都变成真正的无圆角方形,有两个实用的解决办法:
方法一:关闭标记的抗锯齿
这是最简单直接的方案,只需要在scatter()函数里添加antialiased=False参数,强制关闭标记的抗锯齿效果,就能让方形标记保持锐利的直角,哪怕尺寸很小也不会出现圆角。修改后的代码如下:
import matplotlib.pyplot as plt import numpy as np plt.figure(figsize=(3,2),dpi=1000) i = np.arange(1,100) x = i * 3.1426 / np.max(i) y = np.sin(x) s = 1/i print(s) plt.scatter(x/10,y, marker='s', s=s, antialiased=False) plt.show()
方法二:自定义无圆角的方形标记
如果关闭抗锯齿后还是达不到你想要的效果,还可以用matplotlib.path.Path完全自定义一个没有任何圆角的方形标记,确保无论尺寸大小都严格保持直角形状:
import matplotlib.pyplot as plt import numpy as np from matplotlib.path import Path # 定义无圆角方形的顶点坐标和路径指令 square_verts = [ (0.5, 0.5), # 右上角 (-0.5, 0.5), # 左上角 (-0.5, -0.5), # 左下角 (0.5, -0.5), # 右下角 (0.5, 0.5), # 回到起点闭合路径 ] square_codes = [ Path.MOVETO, # 移动到第一个顶点 Path.LINETO, # 画线到下一个顶点 Path.LINETO, Path.LINETO, Path.CLOSEPOLY,# 闭合路径 ] # 创建自定义标记路径 square_path = Path(square_verts, square_codes) plt.figure(figsize=(3,2),dpi=1000) i = np.arange(1,100) x = i * 3.1426 / np.max(i) y = np.sin(x) s = 1/i print(s) plt.scatter(x/10,y, marker=square_path, s=s) plt.show()
一般来说第一种方法就足够解决问题了,第二种方法更适合需要高度自定义标记形状的场景。
内容的提问来源于stack exchange,提问作者Soerendip
相关产品推荐
相关产品推荐

