gpt4 book ai didi

python - Matplotlib - 如何为具有对数刻度的线图设置颜色条

转载 作者:行者123 更新时间:2023-12-05 03:02:45 24 4
gpt4 key购买 nike

我在向对应于幂律的多条线图添加颜色条时遇到问题。

为了为非图像图创建颜色条,我添加了一个虚拟图(来自此处的答案:Matplotlib - add colorbar to a sequence of line plots)。

颜色条刻度与绘图的颜色不对应。

我已经尝试更改颜色条的标准,并且我可以将其微调为在特定情况下半准确,但我通常不能这样做。

def plot_loglog_gauss():
from matplotlib import cm as color_map
import matplotlib as mpl

"""Creating the data"""
time_vector = [0, 1, 2, 4, 8, 16, 32, 64, 128, 256]
amplitudes = [t ** 2 * np.exp(-t * np.power(np.linspace(-0.5, 0.5, 100), 2)) for t in time_vector]

"""Getting the non-zero minimum of the data"""
data = np.concatenate(amplitudes).ravel()
data_min = np.min(data[np.nonzero(data)])

"""Creating K-space data"""
k_vector = np.linspace(0,1,100)

"""Plotting"""
number_of_plots = len(time_vector)
color_map_name = 'jet'
my_map = color_map.get_cmap(color_map_name)
colors = my_map(np.linspace(0, 1, number_of_plots, endpoint=True))

# plt.figure()
# dummy_plot = plt.contourf([[0, 0], [0, 0]], time_vector, cmap=my_map)
# plt.clf()

norm = mpl.colors.Normalize(vmin=time_vector[0], vmax=time_vector[-1])
cmap = mpl.cm.ScalarMappable(norm=norm, cmap=color_map_name)
cmap.set_array([])


for i in range(number_of_plots):
plt.plot(k_vector, amplitudes[i], color=colors[i], label=time_vector[i])

c = np.arange(1, number_of_plots + 1)
plt.xlabel('Frequency')
plt.ylabel('Amplitude')
plt.yscale('symlog', linthreshy=data_min)
plt.xscale('log')
plt.legend(loc=3)

ticks = time_vector
plt.colorbar(cmap, ticks=ticks, shrink=1.0, fraction=0.1, pad=0)

plt.show()

Plot generated

通过与图例进行比较,您会发现刻度值与实际颜色不匹配。例如,128 在颜色图中显示为绿色,而在图例中显示为红色。

实际结果应该是线性颜色的颜色条。在颜色条上以固定间隔刻度(对应于不规则时间间隔......)。当然还有正确的刻度值颜色。

(最终该图包含许多图(len(time_vector) ~ 100),我降低了图的数量以进行说明并能够显示图例。)

澄清一下,这就是我想要的结果。

Plot wanted

最佳答案

最重要的原则是保持线图和 ScalarMappable 的颜色同步。这意味着,线条的颜色不应取自独立的颜色列表,而应取自相同的颜色图并使用与要显示的颜色条相同的标准化。

然后,一个主要问题是决定如何处理 0,它不能成为对数归一化的一部分。以下是一种变通方法,假设线性刻度在 0 到 2 之间,对数刻度在上面,使用 SymLogNorm

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

"""Creating the data"""
time_vector = [0, 1, 2, 4, 8, 16, 32, 64, 128, 256]
amplitudes = [t ** 2 * np.exp(-t * np.power(np.linspace(-0.5, 0.5, 100), 2)) for t in time_vector]

"""Getting the non-zero minimum of the data"""
data = np.concatenate(amplitudes).ravel()
data_min = np.min(data[np.nonzero(data)])

"""Creating K-space data"""
k_vector = np.linspace(0,1,100)

"""Plotting"""
cmap = plt.cm.get_cmap("jet")
norm = mpl.colors.SymLogNorm(2, vmin=time_vector[0], vmax=time_vector[-1])

sm = mpl.cm.ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])

for i in range(len(time_vector)):
plt.plot(k_vector, amplitudes[i], color=cmap(norm(time_vector[i])), label=time_vector[i])

#c = np.arange(1, number_of_plots + 1)
plt.xlabel('Frequency')
plt.ylabel('Amplitude')
plt.yscale('symlog', linthreshy=data_min)
plt.xscale('log')
plt.legend(loc=3)

cbar = plt.colorbar(sm, ticks=time_vector, format=mpl.ticker.ScalarFormatter(),
shrink=1.0, fraction=0.1, pad=0)

plt.show()

enter image description here

关于python - Matplotlib - 如何为具有对数刻度的线图设置颜色条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54513247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com