matplotlib colormap未返回值的预期颜色[重复]

0yycz8jy  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(225)

此问题已在此处有答案

How to apply normalized colorbar to a figure with iterative line plots(1个答案)
How do parameters 'c' and 'cmap' behave?(2个答案)
2个月前关闭。
我在使用matplotlib colormap时遇到了一些问题。我设置了这个示例代码来重现我的问题。

%matplotlib inline

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib import style
from matplotlib import colors
import pandas as pd
import numpy as np

style.use('ggplot')

plot_df = pd.DataFrame({
    'from': [[0, 0], [10, 10], [15, 15], [20, 20]],
    'to':[[10, 10], [20, 20], [30, 30], [40, 40]],
    'value':[0, 5, 10, 15]
})
plot_df['connectionstyle'] = 'arc3, rad=.55'
plot_df['arrowstyle'] = 'Simple, tail_width=1, head_width=10, head_length=15'
plot_df
fig, ax = plt.subplots()

vmin = 0
vmax = 15
scalarmappable = plt.cm.ScalarMappable(norm=colors.Normalize(vmin=vmin, vmax=vmax), cmap='YlOrRd')
cmap = scalarmappable.get_cmap()
cbar = fig.colorbar(scalarmappable, ax=ax)

ticks = np.linspace(vmin, vmax, 5)
cbar.ax.set_yticks(ticks)
cbar.ax.set_yticklabels([f'{tick:.0f}' for tick in ticks])  # vertically oriented colorbar
cbar.outline.set_linewidth(0)


for _, row in list(plot_df.iterrows()):
    start_x = row['from'][0]
    start_y = row['from'][1]
    dest_x = row['to'][0]
    dest_y = row['to'][1]
    plt.scatter([start_x, dest_x], [start_y, dest_y], color='k')
    p = patches.FancyArrowPatch(
        (start_x, start_y),
        (dest_x, dest_y),
        connectionstyle=row.connectionstyle,
        arrowstyle=row.arrowstyle,
        color=cmap(row.value)
    )
    ax.add_patch(p)
   
fig.tight_layout()

正如你在图片中看到的,所有箭头都是黄色的,颜色是cmap的函数,所以我希望至少两个箭头是橙子和红色的。
有人有办法解决这个问题吗?

oewdyzsn

oewdyzsn1#

您的代码可以正常工作,但cmap的范围是0到255,而row.value在循环中的迭代范围是0到15。0和15之间的差异非常小,所以这就是为什么它看起来不起作用。(虽然你可以看到最后一个箭头比第一个箭头稍微橙子)。考虑一下如何扩展,例如,按因子15进行扩展将是一个简单的(黑客)修复:color=cmap(row.value * 15)

**编辑:**请注意,设置vmax=255将正确显示比例尺。

相关问题