此问题已在此处有答案:
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的函数,所以我希望至少两个箭头是橙子和红色的。
有人有办法解决这个问题吗?
1条答案
按热度按时间oewdyzsn1#
您的代码可以正常工作,但
cmap
的范围是0到255,而row.value
在循环中的迭代范围是0到15。0和15之间的差异非常小,所以这就是为什么它看起来不起作用。(虽然你可以看到最后一个箭头比第一个箭头稍微橙子)。考虑一下如何扩展,例如,按因子15进行扩展将是一个简单的(黑客)修复:color=cmap(row.value * 15)
**编辑:**请注意,设置
vmax=255
将正确显示比例尺。