首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用matplotlib避免不同颜色的多簇重叠散点图

利用matplotlib避免不同颜色的多簇重叠散点图
EN

Stack Overflow用户
提问于 2022-10-03 21:33:38
回答 1查看 78关注 0票数 -1

我有下面的散点图,我想降低每种颜色的透明度,以清楚地看到所有的簇:

代码语言:javascript
运行
复制
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循环的情况下,我如何高效地做到这一点?

编辑

代码语言:javascript
运行
复制
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);

问题

黑色星系团是完全覆盖的,我在第二张图片中看不到它。有没有一种方法,我可以使用和找到一个清晰的图片,帮助我看到所有的颜色?

EN

Stack Overflow用户

回答已采纳

发布于 2022-10-03 21:52:45

要将相同的透明度设置为所有人,可以使用ax.scatter(*data.T, c=colors, alpha=0.1)

若要具有单独的透明度,可以使用to_rgba将透明度包含到颜色中。

Matplotlib将按照它们在数组中出现的顺序绘制点。在给定的例子中,所有的黑点都是先画出来的,最后是绿色的。采用随机排序可以解决这一问题。

代码语言:javascript
运行
复制
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现在也被允许成为一个数组。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73941045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档