在 matplotlib 中使用颜色作为渐变进行绘图

Posted

技术标签:

【中文标题】在 matplotlib 中使用颜色作为渐变进行绘图【英文标题】:plotting using color as a gradient in matplotlib 【发布时间】:2022-01-12 06:19:31 【问题描述】:

我是 python 可视化的新手。我试图在左侧绘制相同的数据集,但使用颜色作为渐变和网格线以使其易于理解。但是我被卡住了,我不知道我做了什么,我只是使用了从其他类似问题中获得的参考代码。有人可以帮忙吗?

import random
import matplotlib
import matplotlib.pyplot as plt
import tkinter as tk
from matplotlib.widgets import Slider
from matplotlib import colors
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib import style
import numpy as np

style.use('ggplot')
matplotlib.use('TkAgg')

def update(val):
    pos = s_time.val
    ax.axis([pos, pos+10, 20, 40])
    fig.canvas.draw_idle()

def plot():
    canvas = FigureCanvasTkAgg(fig,root)
    canvas.get_tk_widget().pack(side=tk.TOP, fill = tk.BOTH, expand =1)
    
    fig.subplots_adjust(bottom=0.25)

    y_values = [random.randrange(41) for _ in range(40)]
    x_values = [i for i in range(40)]

    ax.axis([0, 9, 20, 40])
    ax.plot(x_values, y_values)

    #cmap = colors.ListedColormap(['red', 'blue','green'])
    #bounds = [0,10,20,30]
    #norm = colors.BoundaryNorm(bounds, cmap.N)
    #ax1.imshow(ax, cmap=cmap, norm=norm)
    im0  = ax1.pcolormesh([x_values,y_values], vmin=0, vmax=1, cmap="RdBu")
    im = fig.colorbar(im0,cax=ax1)
    ax1.grid(which='major', axis='both', linestyle='-', color='white', linewidth=0.5)

    #ax1.set_yticks(np.arange(0, 40, 2.5))

    ax_time = fig.add_axes([0.12, 0.1, 0.78, 0.03])
    return ax_time
    

root = tk.Tk()
fig = plt.Figure(figsize = (10,10),dpi = 150)
ax=fig.add_subplot(121)
ax1=fig.add_subplot(122)
s_time = Slider(plot(), 'Time', 0, 30, valinit=0)
s_time.on_changed(update)
root.mainloop()

【问题讨论】:

问题不清楚,你的代码不起作用。请具体说明“使用颜色……使其易于理解”的含义。 我想制作一个网格,我给出的点应该用某些颜色绘制在网格上。像这样,matplotlib.org/3.1.1/gallery/images_contours_and_fields/… 建议您查看 matplotlib.org/stable/gallery/images_contours_and_fields/… 而不是 pcolor 示例。您需要 x、y 和一个二维矩阵 Z。 【参考方案1】:

免责声明:不确定我是否正确理解了这个问题。也许您可以提供参考问题的链接。

如果您想在 matplotlib 中为线图添加颜色渐变,据我所知,最好的选择是使用 ax.scatter。此处提出了类似的问题:Matplotlib: different color for every point of line plot 要模拟线图的外观,您需要在将数据传递给 scatter 函数之前对其进行线性插值。 c 关键字参数可用于为每个数据点分配一个颜色值,而 cmap 参数确定从颜色值到颜色的实际映射。

这是一个最低限度的工作示例:

import matplotlib.pyplot as plt
import numpy as np

f, ax = plt.subplots(1, 1)
y_values = np.random.randint(0, 41, size=40)
x_values = np.arange(0, 40, 1)

x_interp = np.arange(0, 40, 0.01)
y_interp = np.interp(x_interp, x_values, y_values)
ax.grid(alpha=0.5)
artist = ax.scatter(x_interp, y_interp, c=y_interp, cmap='seismic', lw=0)
f.colorbar(artist, ax=ax)

产生以下plot

编辑: 澄清后,我将问题解释为: “如何为线图添加背景,显示与 y 轴上的值相对应的颜色渐变”。

我的建议如下:

import matplotlib.pyplot as plt
import numpy as np
f, a  = plt.subplots(1, 1)

value_range = (vmin, vmax) = (0, 40)
x_range = (xmin, xmax) = (0, 60)

X, Y = np.meshgrid(range(xmin, xmax, 1), range(vmin, vmax, 1))
y_data = np.random.randint(vmin, vmax, size=xmax-xmin)
x_data = np.arange(xmin, xmax, 1)

a.pcolormesh(Y, cmap="seismic", alpha=0.5, edgecolors='gray')
a.plot(x_data, y_data, "k-")

然后产生以下plot

【讨论】:

非常感谢!!这与我要求的类似,但我的意思是网格参考图上的颜色(我希望它看起来像):matplotlib.org/3.1.1/gallery/images_contours_and_fields/… 这有帮助!!感谢您的澄清 如果这回答了你的问题,你介意接受它作为答案吗?

以上是关于在 matplotlib 中使用颜色作为渐变进行绘图的主要内容,如果未能解决你的问题,请参考以下文章

带有颜色渐变的 Matplotlib 3D 散点图

matplotlib如何画渐变颜色的线

如何修复不一致的颜色到清晰的径向渐变层

如何使用 blit 有效地重绘多个 matplotlib 图

使用 Kotlin 语言在 Android Studio 中为文本设置渐变颜色

Matplotlib 散点图;颜色作为第三个变量的函数