Phl*_*los 5 python plot matplotlib
我有一个散点图,显示了一个数据集,其中的符号根据某种色标着色。我想通过在它们周围画一个空心圆并将它们用线连接来突出显示其中的几个点。换句话说,在一个非常简化的示例中,我希望结果如下所示:
.
我可以使用以下代码制作一个看起来有点像的图:
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(5,5))
X, Y = np.meshgrid(np.arange(10), np.arange(10))
Z = X**2 + Y**2
plt.scatter(X,Y,c=Z, s=300, cmap='viridis_r')
plt.plot([1, 4, 7], [7, 1, 4], 'k-o', linewidth=3,
markersize=14, markerfacecolor='none', markeredgewidth=2,
)
Run Code Online (Sandbox Code Playgroud)
但是,结果如下所示:
.
我想要的是将标记符号内的线段隐藏起来。这是因为我有兴趣将注意力吸引到特定的数据点上,并且不想将它们部分隐藏起来。
解决方法是:
我的问题是:最好的方法是什么?有没有比上面的选项 1 和 2 更好的方法,如果没有,最好的方法是什么?如上所述,1 我预见了透明度问题(我正在使用),2 我预见坐标系统问题,例如在放大或缩小等的情况下。
(我的示例中的另一个小观察我有点困惑:plt.plot并且plt.scatter似乎没有在完全相同的位置绘制事物(参见此图)并且尺寸定义也不一致)
您想要获得透明(开放)圆,定位在数据坐标中,但半径以点为单位。您想要将圆彼此连接,而不是中心点。这意味着您不能使用普通线路。相反,几个ConnectionPatches 可以提供帮助。您可以将它们缩小一半的标记大小,以便它们接触圆圈的边框。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch
fig, ax = plt.subplots(figsize=(5,5))
X, Y = np.meshgrid(np.arange(10), np.arange(10))
Z = X**2 + Y**2
ax.scatter(X,Y,c=Z, s=300, cmap='viridis_r')
xc = [1, 4, 7]
yc = [7, 1, 4]
ax.plot(xc, yc, linewidth=0, marker="o", color="black",
markersize=np.sqrt(300), markerfacecolor='none', markeredgewidth=3)
for i in range(len(xc)-1):
cp = ConnectionPatch((xc[i],yc[i]), (xc[i+1], yc[i+1]),
coordsA='data', coordsB='data', axesA=ax, axesB=ax,
shrinkA=np.sqrt(300)/2, shrinkB=np.sqrt(300)/2,
linewidth=2)
ax.add_patch(cp)
plt.show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2673 次 |
| 最近记录: |