使用透明标记但不透明边缘绘图

61 投票
2 回答
82698 浏览
提问于 2025-04-18 06:13

我想在matplotlib中画一个图,使用透明的标记,并且这些标记有固定颜色的边框。但是,我似乎无法做到标记的填充是透明的。

我这里有一个最小的工作示例:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y1 = 2*x + 1
y2 = 3*x - 5

plt.plot(x,y1, 'o-', lw=6, ms=14)
plt.plot(x,y2, 'o', ms=14, markerfacecolor=None, alpha=0.5, markeredgecolor='red', markeredgewidth=5)

plt.show()

我尝试了网上找到的两种方法来实现这个效果:

  1. 设置alpha参数。但是,这样会让标记的边框也变得透明,这不是我想要的效果。
  2. 设置markerfacecolor=None,虽然这对我的图没有任何影响。

请问有没有解决办法呢?

2 个回答

8

一般来说,使用透明颜色比使用alpha参数更好。首先,这样做不会影响其他颜色,还能避免一些人提到的黑色填充错误。在这个例子中,我们使用voxels函数在图上绘制了两个体素(voxel)。在存储在colors中的元组里,第四个数字代表了RGBA颜色的透明度值。这种标准化的RGBA元组表示法可以在整个matplotlib中作为颜色使用。

import matplotlib.pyplot as plt, numpy as np, mpl_toolkits.mplot3d
fig = plt.figure()
ax = fig.gca(projection='3d')
voxels = np.array([[[True],[True]]])
colors = np.array([[[(0., 0., 0., 0.)],[(1.0, 0., 0., 0.5)]]])
ax.voxels(voxels, facecolors=colors, edgecolor='k', linewidth=.5)
plt.show(block=True)

在这里输入图片描述

96

在使用Matplotlib的时候,这个问题有点棘手……你需要用一个字符串 "None" 来代替值 None,然后你就可以直接这样做:

plt.plot(x,y2, 'o', ms=14, markerfacecolor="None",
         markeredgecolor='red', markeredgewidth=5)

撰写回答