如何将Matplotlib 3D图Z轴刻度标签颜色与散点颜色匹配?
如何将Z轴刻度标签的颜色与散点颜色匹配?
核心解决方案:循环设置刻度标签颜色
我已经通过一个循环实现了Z轴刻度标签颜色与散点颜色的匹配,代码如下:
for i, x in enumerate(plt.cm.jet(np.linspace(0,1,N))): plt.gca().get_zticklabels()[i].set_color(x)
这里使用plt.cm.jet(np.linspace(0,1,N))生成了一组渐变调色板,N对应散点的数量(或Z轴刻度的数量,需保证两者数量一致),循环会逐个将每个Z轴刻度标签的颜色设置为对应位置的散点颜色。
进阶:自定义3D坐标轴完整实现
为了实现更个性化的3D坐标轴(比如自定义网格线颜色、轴样式),我结合了两种思路:一是为特定网格线/刻度线着色的逻辑,二是重写_axinfo属性来自定义轴的基础样式。下面是完整的实现代码:
import numpy as np from mpl_toolkits.mplot3d import Axes3D from mpl_toolkits.mplot3d.axis3d import Axis import matplotlib.pyplot as plt import matplotlib.projections as proj from matplotlib.colors import colorConverter # 自定义轴的基础配置 custom_AXINFO = { 'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2), # 空平面 'color': (0, 0, 0)}, 'y': {'i': 1, 'tickdir': 0, 'juggled': (0, 1, 2), # 日期平面 'color': (0.756, 0.145, 0.184)}, 'z': {'i': 2, 'tickdir': 0, 'juggled': (0, 2, 1), 'color': (0.835, 0.549, 0.164)}, } # 底部平面 class axis3d_custom(Axis): def __init__(self, adir, v_intervalx, d_intervalx, axes, *args, **kwargs): Axis.__init__(self, adir, v_intervalx, d_intervalx, axes, *args, **kwargs) self.gridline_colors = [] def set_gridline_color(self, *gridline_info): '''Gridline_info是包含要修改的网格线值和对应颜色的元组,可通过*运算符传入元组列表''' self.gridline_colors.extend(gridline_info) def draw(self, renderer): # 过滤位置,避免绘制多余网格线 Axis.draw(self, renderer) which_gridlines = [] if self.gridline_colors: locmin, locmax = self.get_view_interval() if locmin > locmax: locmin, locmax = locmax, locmin # 基础裁剪处理 majorLocs = [loc for loc in self.major.locator() if locmin <= loc <= locmax] for i, val in enumerate(majorLocs): for colored_val, color in self.gridline_colors: if val == colored_val: which_gridlines.append((i, color)) colors = self.gridlines.get_colors() for val, color in which_gridlines: colors[val] = colorConverter.to_rgba(color) self.gridlines.set_color(colors) self.gridlines.draw(renderer, project=True) class XAxis(axis3d_custom): _AXINFO = custom_AXINFO def get_data_interval(self): '返回此轴数据范围的Interval实例' return self.axes.xy_dataLim.intervalx class YAxis(axis3d_custom): _AXINFO = custom_AXINFO def get_data_interval(self): '返回此轴数据范围的Interval实例' return self.axes.xy_dataLim.intervaly class ZAxis(axis3d_custom): _AXINFO = custom_AXINFO def get_data_interval(self): '返回此轴数据范围的Interval实例' return self.axes.zz_dataLim.intervalx class Axes3D_custom(Axes3D): """ 自定义3D坐标轴对象 """ name = '3d_custom' def _init_axis(self): '''初始化3D轴;覆盖常规X/Y轴的创建逻辑''' self.w_xaxis = XAxis('x', self.xy_viewLim.intervalx, self.xy_dataLim.intervalx, self) self.xaxis = self.w_xaxis self.w_yaxis = YAxis('y', self.xy_viewLim.intervaly, self.xy_dataLim.intervaly, self) self.yaxis = self.w_yaxis self.w_zaxis = ZAxis('z', self.zz_viewLim.intervalx, self.zz_dataLim.intervalx, self) self.zaxis = self.w_zaxis for ax in self.xaxis, self.yaxis, self.zaxis: ax.init3d() # 注册自定义3D投影 proj.projection_registry.register(Axes3D_custom) # 绘制带颜色映射的3D散点图 bx.scatter(xs,ys,zs, zdir=zs,c=plt.cm.jet(np.linspace(0,1,N)))
以上代码运行后生成的图表效果符合预期,完美实现了Z轴刻度标签颜色与散点颜色匹配,同时自定义了3D坐标轴的样式。
内容的提问来源于stack exchange,提问作者Sirmione
相关产品推荐
相关产品推荐

