在 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 中使用颜色作为渐变进行绘图的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 blit 有效地重绘多个 matplotlib 图