我有下面的散点图,我想降低每种颜色的透明度,以清楚地看到所有的簇:
import numpy as np
import matplotlib.pyplot as plt
n = 1600
np.random.seed(0)
data1 = np.random.randn(n, 2) + np.asarray([2, 0])
data2 = np.random.randn(n, 2) + np.asarray([-2, 0])
data3 = np.random.randn(n, 2) + np.asarray([0, 2])
data4 = np.random.randn(n, 2) + np.asarray([0, -2])
data = np.concatenate((data1, data2, data3, data4))
labels = np.concatenate((n*[1], n*[2], n*[3], n*[4]))
fig, ax = plt.subplots()
colors_list = ['k', 'r', 'orange', 'g']
color_codes = np.asarray(colors_list)
colors = color_codes[labels-1]
ax.scatter(*data.T, c = colors);
问题
在没有For循环的情况下,我如何高效地做到这一点?
编辑
n = 1600
np.random.seed(0)
data1 = np.random.randn(n, 2) + np.asarray([1, 0])
data2 = np.random.randn(n, 2) + np.asarray([-1, 0])
data3 = np.random.randn(n, 2) + np.asarray([0, 1])
data4 = np.random.randn(n, 2) + np.asarray([0, -1])
data = np.concatenate((data1, data2, data3, data4))
labels = np.concatenate((n*[1], n*[2], n*[3], n*[4]))
# alphas = np.concatenate((n*[.1], n*[.2], n*[.3], n*[.4]))
alphas = np.linspace(0.1, 1, n)
fig, ax = plt.subplots()
colors_list = ['k', 'r', 'orange', 'g']
color_codes = np.asarray(colors_list)
colors = color_codes[labels-1]
ax.scatter(*data.T, c = colors, alpha = 0.1, s=10);
fig, ax = plt.subplots()
colors_list = ['k', 'r', 'orange', 'g']
color_codes = np.asarray(colors_list)
colors = color_codes[labels-1]
ax.scatter(*data.T, c = colors);
问题
黑色星系团是完全覆盖的,我在第二张图片中看不到它。有没有一种方法,我可以使用和找到一个清晰的图片,帮助我看到所有的颜色?
发布于 2022-10-03 21:52:45
要将相同的透明度设置为所有人,可以使用ax.scatter(*data.T, c=colors, alpha=0.1)
。
若要具有单独的透明度,可以使用to_rgba
将透明度包含到颜色中。
Matplotlib将按照它们在数组中出现的顺序绘制点。在给定的例子中,所有的黑点都是先画出来的,最后是绿色的。采用随机排序可以解决这一问题。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import to_rgba
n = 1600
np.random.seed(0)
data1 = np.random.randn(n, 2) + np.asarray([2, 0])
data2 = np.random.randn(n, 2) + np.asarray([-2, 0])
data3 = np.random.randn(n, 2) + np.asarray([0, 2])
data4 = np.random.randn(n, 2) + np.asarray([0, -2])
data = np.concatenate((data1, data2, data3, data4))
labels = np.concatenate((n * [1], n * [2], n * [3], n * [4]))
labels = np.repeat([1, 2, 3, 4], n)
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 5))
colors_list = [to_rgba('k', 0.05), to_rgba('r', 0.1), to_rgba('orange', 0.15), to_rgba('g', 0.15)]
color_codes = np.asarray(colors_list)
colors = color_codes[labels - 1]
ax1.scatter(*data.T, c=colors)
ax1.set_title('Original order')
order = np.arange(len(labels))
np.random.shuffle(order)
ax2.scatter(*data[order, :].T, c=colors[order])
ax2.set_title('Randomized order')
plt.show()
PS:另一个遗憾的删除,答案是@t.o。显示在最新的matplotlib版本中,alpha
现在也被允许成为一个数组。
https://stackoverflow.com/questions/73941045
复制相似问题