通过matplotlib图中的点删除线

时间:2018-03-21 21:24:56

标签: python matplotlib

我有以下matplotlib代码段:

fig, ax = plt.subplots(figsize=(6,6))
values = np.random.normal(loc=0, scale=1, size=10)
ax.plot(range(10), values, 'r^', markersize=15, alpha=0.4);

产生

enter image description here

按计划。

我想让这条线在与点重叠的地方不可见,这样这些点看起来更多地被线条连接而不是位于线条的顶部。可以通过使线在它们重叠的位置不可见或创建一个简单地链接点而不是跟踪它们的新线对象来做到这一点吗?

明确地说,我不希望删除整个行,只删除与点重叠的部分。

2 个答案:

答案 0 :(得分:2)

通常很难让线条停留在标记的边缘。原因是线条在数据坐标中定义,而标记在点中定义。

解决方法是隐藏标记所在的行。我们可能会想到一个三层系统。最低层(zorder=1)包含线条,就像它们一样。上面的层包含与要显示的标记具有相同形状和大小的标记。然而,它们的颜色与背景颜色相同(通常为白色)。最顶层包含所需的标记。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(42)

fig, ax = plt.subplots(figsize=(6,5))

def plot_hidden_lines(x,y, ax = None, ms=15, color="r", 
                      marker="^", alpha=0.4,**kwargs):
    if not ax: ax=plt.gca()
    ax.scatter(x,y, c=color, s=ms**2, marker=marker, alpha=alpha, zorder=3)
    ax.scatter(x,y, c="w", s=ms**2, marker=marker, alpha=1, zorder=2)
    ax.plot(x,y, color=color, zorder=1,alpha=alpha,**kwargs)


values1 = np.random.normal(loc=0, scale=1, size=10)
values2 = np.random.normal(loc=0, scale=1, size=10)
x = np.arange(len(values1))

plot_hidden_lines(x,values1)
plot_hidden_lines(x,values2, color="indigo", ms=20, marker="s")

plt.show()

enter image description here

答案 1 :(得分:0)

我认为最好的解决方法是将三角形覆盖在线条上:

import numpy as np
import matplotlib.pyplot as plt
values = np.random.normal(loc= 0, scale=1, size=10)
for i in range(9):
     start_coordinate, end_coordinate = some_function(values[i], values[i+1])
     plt.plot([i, i+1], [start_coordinate, end_coordinate], *whatever_other_arguments)
plt.scatter(range(10), values, *whatever_other_arguments)
plt.show()

该计划输出: output of program

如果您真的想要透视方面,我建议您以某种方式计算线条与标记重叠的位置,并仅绘制其间的线条:

  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName('YOUR_SHEET');
  var range = sheet.getRange(5, 7, 3, 6);
  var targetRange = sheet.getRange(5, 7, sheet.getLastRow(), 6);
  range.autoFill(targetRange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);

这里的困难部分当然是计算这些坐标(如果你想放大这个不可取的工作),但老实说,考虑到这个问题的难度,我认为你找不到任何东西更好...