将颜色条添加到calmap图中

时间:2016-03-08 15:26:45

标签: python-2.7 matplotlib plot

这是我在这里的第一篇文章!

我使用calmap绘制好的日历图来分析一些数据。日历图使用色彩图来显示天数之间的对比度。我遇到的问题是calmap不提供友好的工具来显示与日历图关联的颜色条。我想知道你们其中一个人是否有解决方案。理想的情况是为整个图形设置颜色条而不仅仅是一个轴。

calmap的文档:http://pythonhosted.org/calmap/

import pandas as pd

import numpy as np

import calmap # pip install calmap

%matplotlib inline

df=pd.DataFrame(data=np.random.randn(500,1)
                ,index=pd.date_range(start='2014-01-01 00:00:00',freq='1D',periods =500)
                ,columns=['data'])

fig,ax=calmap.calendarplot(df['data'],
                    fillcolor='grey', linewidth=0,cmap='RdYlGn',
                    fig_kws=dict(figsize=(17,8)))

fig.suptitle('Calendar view' ,fontsize=20,y=1.08)

calmap绘图示例

enter image description here

2 个答案:

答案 0 :(得分:4)

在此处深入了解calmap代码martijnvermaat/calmap我明白了

  • calendarplot为每个子图调用几个年份图(在您的情况下为两次)
  • yearplot创建一个带背景的第一个<project> <modelVersion>4.0.0</modelVersion> <groupId>...</groupId> <artifactId>...</artifactId> <packaging>apk</packaging> ... </project> ,然后创建一个带有实际数据的另一个,加上一堆其他东西。

要深入了解与您可以使用的轴相关的对象(我假设您的代码导入和数据初始化在此之前):

ax.pcolormesh

现在,我们可以使用ax[0].get_children() [<matplotlib.collections.QuadMesh at 0x11ebd9e10>, <matplotlib.collections.QuadMesh at 0x11ebe9210>, <- that's the one we need! <matplotlib.spines.Spine at 0x11e85a910>, <matplotlib.spines.Spine at 0x11e865250>, <matplotlib.spines.Spine at 0x11e85ad10>, <matplotlib.spines.Spine at 0x11e865490>, <matplotlib.axis.XAxis at 0x11e85a810>, <matplotlib.axis.YAxis at 0x11e74ba90>, <matplotlib.text.Text at 0x11e951dd0>, <matplotlib.text.Text at 0x11e951e50>, <matplotlib.text.Text at 0x11e951ed0>, <matplotlib.patches.Rectangle at 0x11e951f10>] fig.colorbar是此函数的包装器),如此答案所示 Matplotlib 2 Subplots, 1 Colorbar

plt.colorbar

这会产生垂直colobar引用第一个图中唯一的颜色,但所有图的颜色都相同。

enter image description here

我仍然在更好地使用轴和水平位置,但是从这里开始应该很容易。

作为奖金,对于一年的情节:

fig,ax=calmap.calendarplot(df['data'],
                    fillcolor='grey', linewidth=0,cmap='RdYlGn',
                    fig_kws=dict(figsize=(17,8)))

fig.colorbar(ax[0].get_children()[1], ax=ax.ravel().tolist())

enter image description here

答案 1 :(得分:1)

将@kidpixo答案和来自{bogatron的this answer放在一起,我准备了一个自包含的示例,“做了明显的事情”,在回弹区的右侧创建了一个色条,并匹配其高度。

import pandas as pd
import numpy as np
import calmap # pip install calmap
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
%matplotlib inline

df=pd.DataFrame(data=np.random.randn(500,1)
                ,index=pd.date_range(start='2014-01-01 00:00:00',freq='1D',periods =500)
                ,columns=['data'])

fig = plt.figure(figsize=(20,8))
ax = fig.add_subplot(111)
cax = calmap.yearplot(df.data, year=2014, ax=ax, cmap='YlGn')
# fig.colorbar(cax.get_children()[1], ax=cax, orientation='horizontal')
divider = make_axes_locatable(cax)
lcax = divider.append_axes("right", size="2%", pad=0.5)
fig.colorbar(cax.get_children()[1], cax=lcax)

example calmap with side colorbar