为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建基于 y 值的梯度阶梯图?

如何创建基于 y 值的梯度阶梯图?

翻过高山走不出你 2023-09-05 17:16:21
在 Python matplotlib 中,如何获得折线图或阶梯图中的线以显示基于 y 值的梯度?示例图(在 Tableau 中制作):带有根据 x 值改变梯度的线的阶梯图代码,改编自此答案:fig, ax = plt.subplots(figsize=(10, 4))x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]y = [2, 3, 9, 10, 2, 9, 0, 1, 9, 1, -8]T = np.linspace(0,1,np.size(x))**2s = 1for i in range(0, len(x)-s, s):    ax.step(x[i:i+s+1], y[i:i+s+1],  marker='.', color=(0.0,0.5,T[i]))ax.tick_params(axis='both', colors='lightgray', labelsize=8)
查看完整描述

1 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

以下代码的灵感来自matplotlib 文档中的多色线示例。首先,使用 y 值绘制水平线段并为其着色。垂直部分被细分为小块,并单独着色。

vmin标准的值设置得低一些,以避免颜色图的范围太亮。

import matplotlib.pyplot as plt

from matplotlib.collections import LineCollection

import numpy as np


x = np.arange(50)

y = np.random.randint(-3, 4, x.size).cumsum()


fig, ax = plt.subplots()


norm = plt.Normalize(y.min() - y.ptp() * .2, y.max())

cmap = 'inferno_r'  # 'Reds'

horizontal_lines = np.array([x[:-1], y[:-1], x[1:], y[:-1]]).T.reshape(-1, 2, 2)

hor_lc = LineCollection(horizontal_lines, cmap=cmap, norm=norm)

hor_lc.set_array(y[:-1])

ax.add_collection(hor_lc)


factor = 10

long_y0 = np.linspace(y[:-1], y[1:], factor)[:-1, :].T.ravel()

long_y1 = np.linspace(y[:-1], y[1:], factor)[1:, :].T.ravel()

long_x = np.repeat(x[1:], factor - 1)

vertical_lines = np.array([long_x, long_y0, long_x, long_y1]).T.reshape(-1, 2, 2)

ver_lc = LineCollection(vertical_lines, cmap=cmap, norm=norm)

ver_lc.set_array((long_y0 + long_y1) / 2)

ax.add_collection(ver_lc)


ax.scatter(x, y, c=y, cmap=cmap, norm=norm)

plt.autoscale() # needed in case the scatter plot would be omited

plt.show()

https://img4.sycdn.imooc.com/64f6f2330001381b12650398.jpg

这是另一个示例,具有黑色背景。在这种情况下,避免了颜色图的最暗部分。更改的代码部分是:


y = np.random.randint(-9, 10, x.size)


ax.patch.set_color('black')


norm = plt.Normalize(y.min(), y.max() + y.ptp() * .2)

cmap = 'plasma_r'

https://img3.sycdn.imooc.com/64f6f2430001d3af06520263.jpg

这是一个带有 a 和蓝-白-红颜色图的示例TwoSlopeNorm:


from matplotlib.colors import TwoSlopeNorm


y = np.random.uniform(-1, 1, x.size * 10).cumsum()[::10]

y = (y - y.min()) / y.ptp() * 15 - 5


norm = TwoSlopeNorm(vmin=-5, vcenter=0, vmax=10)

cmap = 'bwr'

https://img3.sycdn.imooc.com/64f6f24e0001e74c06530265.jpg

查看完整回答
反对 回复 2023-09-05
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信