首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据一定规律改变散点图颜色

如何根据一定规律改变散点图颜色
EN

Stack Overflow用户
提问于 2015-10-19 14:14:28
回答 3查看 2.3K关注 0票数 1

我必须做一个散点图,它的颜色取决于第三个变量。如果变量介于0到1之间,给出“蓝色”,1-2,红色,2-3,紫色,3-4,绿色,4-5灰色。我怎么能这么做?

代码语言:javascript
复制
x = [1,2,3,4,5]
y = [3,4,2,3,4]
c = [1,2,4,0.5,5]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-19 14:54:45

如果您想要颜色映射的特定边界,可以将mpl.colors.BoundaryNormmpl.colors.ListedColormap一起使用。

代码语言:javascript
复制
import matplotlib.pyplot as plt
import matplotlib as mpl

x = [1,2,3,4,5]
y = [3,4,2,3,4]
c = [1,2,4,0.5,5]

cmap = mpl.colors.ListedColormap(['blue','red','magenta', 'green', 'gray'])
c_norm = mpl.colors.BoundaryNorm(boundaries=[0,1,2,3,4,5], ncolors=5)
plt.scatter(x, y, c=c, s=200, cmap=cmap, norm=c_norm)
plt.colorbar()
plt.show()

这给出了这个情节:

票数 4
EN

Stack Overflow用户

发布于 2015-10-19 14:24:47

您可以创建和使用列出的颜色图:

代码语言:javascript
复制
import matplotlib as mpl
import matplotlib.pyplot as plt

x = [1,2,3,4,5]
y = [3,4,2,3,4]
c = [1,2,4,0.5,5]    
cmap = mpl.colors.ListedColormap( [[1., 0., 0.],
                                   [0., 1., 0.],
                                   [0., 0., 1.]])
plt.scatter(x, y, c=c, s=100, cmap=cmap)
plt.show()
票数 0
EN

Stack Overflow用户

发布于 2020-02-02 21:04:26

下面是另一个例子,根据年龄对散点图进行着色。

BoundaryNorm为每个年龄范围设置边界,并将颜色关联到每个年龄范围。

例如,如果存在年龄范围< 18, 18-40, 40-65, 65-80, > 80,则可以将这些边界列出为[18,40,65,80]。BoundaryNorm需要比颜色数多一个绑定,所以您可以在前面添加0,在末尾添加100

您可以从现有的颜色映射创建一个颜色映射,给出所需的颜色数:plt.cm.get_cmap('plasma_r', len(boundaries)+1)或ListedColormap,给它一个显式的颜色列表:matplotlib.colors.ListedColormap([...])

示例代码:

代码语言:javascript
复制
import matplotlib
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np

N = 30
df = pd.DataFrame({'x': np.random.randint(4,12,N),
                   'y': np.random.randint(4,10,N),
                   'birthdt': np.random.randint(1,95, N)})
boundaries = [18, 40, 65, 80]
cmap = matplotlib.colors.ListedColormap(['limegreen', 'dodgerblue', 'crimson', 'orange', 'fuchsia'])
# cmap = plt.cm.get_cmap('plasma_r', len(boundaries) + 1)
norm = matplotlib.colors.BoundaryNorm([0]+boundaries+[100], len(boundaries)+1)

plt.scatter(df.x, df.y, s=60, c=df.birthdt, cmap=cmap, norm=norm)
cbar = plt.colorbar(extend='max')
cbar.ax.set_ylabel('Age')
plt.show()

如果您希望按年龄范围按比例进行色条分离,则可以尝试:

代码语言:javascript
复制
import matplotlib
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np

N = 30
df = pd.DataFrame({'x': np.random.randint(4, 12, N),
                   'y': np.random.randint(4, 10, N),
                   'birthdt': np.random.randint(1, 95, N)})
boundaries = [18, 30, 65, 80]
max_age = 100
base_colors = ['limegreen', 'dodgerblue', 'crimson', 'orange', 'fuchsia']
full_colors = [c for c, b0, b1 in zip(base_colors, [0] + boundaries, boundaries + [max_age]) for i in range(b1 - b0)]
cmap_full = matplotlib.colors.ListedColormap(full_colors)
norm_full = matplotlib.colors.Normalize(vmin=0, vmax=max_age)
plt.scatter(df.x, df.y, s=60, c=df.birthdt, cmap=cmap_full, norm=norm_full)
cbar = plt.colorbar(extend='max', ticks=boundaries)
cbar.ax.set_ylabel('Age')
plt.show()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33216737

复制
相关文章

相似问题

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