Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib:使用开放标记打印线,其中线在标记中不可见_Python_Matplotlib_Plot - Fatal编程技术网

Python Matplotlib:使用开放标记打印线,其中线在标记中不可见

Python Matplotlib:使用开放标记打印线,其中线在标记中不可见,python,matplotlib,plot,Python,Matplotlib,Plot,我有一个散点图,显示了一个数据集,其中的符号根据某种颜色比例着色。我想突出其中几个点,在它们周围画一个开放的圆圈,并用一条线连接它们。换句话说,在一个非常简化的示例中,我希望结果如下所示: 我可以使用以下代码绘制一个有点像这样的图: import numpy as np import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(5,5)) X, Y = np.meshgrid(np.arange(10), np.aran

我有一个散点图,显示了一个数据集,其中的符号根据某种颜色比例着色。我想突出其中几个点,在它们周围画一个开放的圆圈,并用一条线连接它们。换句话说,在一个非常简化的示例中,我希望结果如下所示:

我可以使用以下代码绘制一个有点像这样的图:

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, 
        )
但是,结果如下所示:

我想要的是,将标记符号内的线段从视图中隐藏。这是因为我有兴趣将注意力吸引到特定的数据点上,并且不想部分地将它们隐藏起来

解决办法是:

  • 要复制要高亮显示的数据点,请使用与标记隐藏的原始符号完全相同的颜色填充标记。这并不令人满意,因为(a)我并不总是能够访问数据,只能访问输出图形或轴实例,以及(b)我不知道如何在半透明符号的情况下做到这一点,这在我的实际数据集中就是如此
  • 手动计算调整后的坐标,使连接线仅到达标记的边缘。这似乎也很不令人满意(我不知道该怎么做,因为轴的坐标系和符号的坐标系不一样)
  • 我的问题是:最好的方式是什么?是否有比上述选项1和2更好的方法,如果没有,最好的方法是什么?如前所述,使用1我预见到透明度问题(我正在使用),使用2我预见到坐标系问题,例如放大或缩小等


    (我的例子中的另一个我有点困惑的小观察:
    plt.plot
    plt.scatter
    似乎没有在完全相同的位置绘制东西(),而且大小定义也不一致)

    您想要得到透明(开放)的圆,在数据坐标中定位,但以点为半径。您希望将圆彼此连接起来,而不是将圆心连接起来。这意味着您不能使用普通线。相反,几个
    ConnectionPatch
    es可能会有所帮助。您可以将它们缩小一半的标记大小,使它们接触到圆的边界

    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()