交互式 Matplotlib 颜色条“可拉伸”,如 DS9 或 QFitsView 颜色条

问题描述 投票:0回答:0

如果您在 DS9 或 QFitsView 中打开任何图像,则可以通过单击并向两个方向拖动鼠标来更改颜色条:

  • 在垂直方向上,拉伸颜色条的颜色图。如果拉伸太多,您将只有一种颜色,如果压缩太多,您将只有最小和最大颜色(黑色和白色)。
  • 在水平方向上,您选择颜色图的中心值。如果向右拖动鼠标,颜色图的中心值将接近最小值。如果向左拖动,将接近最大值,最小值和最大值都是固定的。

我认为我的图像结果非常正确,我的代码如下,但颜色图不会拉伸,只是刻度/值。我想知道是否可以制作一个与 qfitsview 相同的颜色条,使用 matplotlib 颜色条看到颜色图拉伸而不仅仅是刻度/值。我也不知道 PowerNorm 是否是正确使用的规范,因为我希望围绕中心值进行拉伸,而不是所有颜色图都在最小值或最大值中崩溃。

这是我的尝试: 该代码在 jupyter 笔记本中运行。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm, PowerNorm, SymLogNorm
from ipywidgets import interact, FloatSlider
from matplotlib.ticker import MaxNLocator

data = np.random.rand(10,10)
def update_plot(gamma,vmin,vmax):
    # Create a PowerNorm with the current gamma value and fixed vmin/vmax
    norm = PowerNorm(gamma=gamma, vmin=vmin, vmax=vmax)

    plt.imshow(data, cmap='viridis', norm=norm)
    # Get the current axes and create a ScalarMappable to set the number of levels for the colorbar
    ax = plt.gca()
    sm = plt.cm.ScalarMappable(cmap='viridis', norm=norm)
    sm.set_array(data)  # Set the data to determine colorbar levels

    # Adjust the colorbar to show more levels for stretching effect
    plt.colorbar(sm, ax=ax, extend='both', ticks=MaxNLocator(nbins=10))  # You can adjust nbins as needed
    plt.title(f'Colormap: Viridis, PowerNorm (Gamma: {gamma}, vmin: {vmin}, vmax: {vmax})')
    plt.show()


# Use interact to create the interactive plot with sliders for gamma, vmin, and vmax
interact(update_plot,
         gamma=FloatSlider(value=0.5, min=0.01, max=2.0, step=0.01, description='Gamma'),
         vmin=FloatSlider(value=np.min(data), min=np.min(data), max=np.max(data), step=0.01, description='vmin'),
         vmax=FloatSlider(value=np.max(data), min=np.min(data), max=np.max(data), step=0.01, description='vmax'));
plt.show()
matplotlib interactive colorbar colormap stretch
© www.soinside.com 2019 - 2024. All rights reserved.