在下图中,我想为日历图添加一个图例.使用ax.plot(...,label ='a')绘制日历图,并在52x7网格中绘制矩形(52周,每周7天).
该传奇目前使用:
plt.gca().legend(loc="upper right")
Run Code Online (Sandbox Code Playgroud)
如何将此图例更正为更像颜色条的内容?此外,颜色条应放在图的底部.
编辑:上传的代码和数据在这里复制:https: //www.dropbox.com/sh/8xgyxybev3441go/AACKDiNFBqpsP1ZttsZLqIC4a?dl=0

除了 - 现有的错误
您放在Dropbox上的代码无法"开箱即用".尤其是-你试图把一个datetime.timedelta由numpy.timedelta64在两个地方和失败.
您可以进行自己的规范化和颜色映射(color_list根据int()规范化值的转换调用).你1从中减去你不需要 - 你已经使用了这个值int().这样做的结果是,您可以获得一个索引,-1这意味着您的最小值被错误地映射到最大值的颜色.如果您绘制列,这是最明显的'BIOM'.
我通过0.00001在你除以的值的总范围中添加一个微小的值()来攻击它.这是一个黑客 - 我不确定这种映射方法是matplotlib的最佳用法,但这完全是一个不同的问题.
有了这些错误修复,并添加下面的所有现有的最后suplot(即替换3与4您的所有来电subplot2grid(),您可以执行以下操作:
替换你的
plt.gca().legend(loc="upper right")
Run Code Online (Sandbox Code Playgroud)
同
# plot an overall colorbar type legend
# Grab the new axes object to plot the colorbar on
ax_colorbar = plt.subplot2grid((4,num_yrs), (3,0),rowspan=1,colspan=num_yrs)
mappableObject = matplotlib.cm.ScalarMappable(cmap = palettable.colorbrewer.sequential.BuPu_9.mpl_colormap)
mappableObject.set_array(numpy.array(df[col_name]))
col_bar = fig.colorbar(mappableObject, cax = ax_colorbar, orientation = 'horizontal', boundaries = numpy.arange(min_val,max_val,(max_val-min_val)/10))
# You can change the boundaries kwarg to either make the scale look less boxy (increase 10)
# or to get different values on the tick marks, or even omit it altogether to let
col_bar.set_label(col_name)
ax_colorbar.set_title(col_name + ' color mapping')
Run Code Online (Sandbox Code Playgroud)
我用你的两个列('NMN'和'BIOM')和Python 2.7 测试了这个(我假设你使用Python 2.x给出了print语句语法)

它创建了一个ScalarMappablematplotlib可用于将值映射到颜色的对象.它将数组设置为将此映射基于您正在处理的列中的所有值.然后它用于Figure.colorbar()添加颜色条 - 传入可映射的对象,以便标签正确.我添加了边界,以便显式显示最小值 - 如果您希望matplotlib为其自身排序,则可以省略它.
PS我已经将colormap设置为palettable.colorbrewer.sequential.BuPu_9.mpl_colormap匹配你的get_colors()函数,它将这些颜色作为9个成员列表.我强烈建议您输入要用作好名称的色彩图,以便更容易理解mpl_colors和mpl_colormap的使用,例如
import palettable.colorbrewer.sequential.BuPu_9 as color_scale
Run Code Online (Sandbox Code Playgroud)
然后访问它
color_scale.mpl_colormap
Run Code Online (Sandbox Code Playgroud)
这样,您可以保持代码干燥并仅使用一次更改来更改颜色.
对于美学理想,色条可能有点大(当然很高).有几种可能的选择.我会指出你两个:
"正确"的方式可能是使用a Gridspec
您可以使用现有方法,但增加行数并使颜色栏仍然在一行中,而其他元素跨越的行数多于当前行.
我已经实现了9行,一个额外的列(以便月份标签不会丢失)和底行的颜色栏,比主要数字少2列.我也用tight_layout它w_pad=0.0来避免标签冲突.您可以使用它来获得您确切的首选大小. 这里有新代码.
这给出了:
:
| 归档时间: |
|
| 查看次数: |
1107 次 |
| 最近记录: |