如何在matplotlib中实现颜色渐变绘图并添加网格线
问题描述
我是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()
修复后可运行代码
import random import matplotlib # 后端设置必须放在导入pyplot之前,避免冲突 matplotlib.use('TkAgg') import matplotlib.pyplot as plt from matplotlib.collections import LineCollection import tkinter as tk from matplotlib.widgets import Slider from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib import style import numpy as np style.use('ggplot') def update(val): pos = s_time.val # 同步更新左右子图的x轴范围,保证展示数据一致 ax.axis([pos, pos+10, 20, 40]) ax1.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) # 调整布局,预留colorbar位置和滑块位置 fig.subplots_adjust(bottom=0.25, right=0.9) y_values = [random.randrange(20,41) for _ in range(40)] # 对齐y轴范围20-40 x_values = np.arange(40) # 左侧子图:普通折线 ax.axis([0, 9, 20, 40]) ax.plot(x_values, y_values) ax.set_title("基础折线图") # 右侧子图:渐变折线+网格 ax1.axis([0, 9, 20, 40]) ax1.set_title("渐变可视化折线图") ax1.grid(which='major', axis='both', linestyle='-', color='white', linewidth=0.5) # 构造渐变折线所需的线段集合 points = np.array([x_values, y_values]).T.reshape(-1, 1, 2) segments = np.concatenate([points[:-1], points[1:]], axis=1) lc = LineCollection(segments, cmap='RdBu', norm=plt.Normalize(20,40)) lc.set_array(y_values) # 用y值映射颜色 lc.set_linewidth(2) line = ax1.add_collection(lc) # 单独新建axes放colorbar,不占用子图空间,解决卡顿问题 cbar_ax = fig.add_axes([0.92, 0.25, 0.02, 0.6]) fig.colorbar(line, cax=cbar_ax, label='Y值大小') ax_time = fig.add_axes([0.12, 0.1, 0.78, 0.03]) return ax_time root = tk.Tk() root.title("双图可视化工具") fig = plt.Figure(figsize = (10,5),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后端冲突导致的渲染异常
- 采用
LineCollection实现折线颜色随Y值渐变,满足同数据集颜色可视化的需求 - 单独创建区域放置颜色条,不再占用右侧子图的绘图空间,解决卡顿问题
- 滑块拖动时同步更新左右子图的X轴范围,保证两侧展示的数据段完全一致
- 保留右侧子图的白色网格线设置,提升数据可读性
内容的提问来源于stack exchange,提问作者sillydoubts
相关产品推荐
相关产品推荐

