Matplotlib Auto Annotate max不添加注释,将图表推离页面

时间:2019-09-20 15:02:32

标签: python matplotlib

您好,我正在尝试自动注释matplotlib图表。

我已经设法以一种在运行时不会给我任何错误的方式来创建它。

但是,它不会绘制注释,当我在jupyter笔记本中进行绘制时,它会将绘制直接推到页面之外。

我要寻找的结果是自动分配注释,该注释指向图表上系列ppc_rolling_7d中的最大数字。

我对这里发生的事情有点想法。

示例数据:

ppc_data = pd.DataFrame({
'Day':['2018-08-31', '2018-09-01', '2018-09-02', '2018-09-03',
'2018-09-04', '2018-09-05', '2018-09-06', '2018-09-07',
'2018-09-08', '2018-09-09', '2018-09-10', '2018-09-11',
'2018-09-12', '2018-09-13', '2018-09-14', '2018-09-15',
'2018-09-16', '2018-09-17', '2018-09-18', '2018-09-19',
'2018-09-20', '2018-09-21', '2018-09-22', '2018-09-23',
'2018-09-24', '2018-09-25', '2018-09-26', '2018-09-27',
'2018-09-28', '2018-09-29', '2018-09-30', '2018-10-01',
'2018-10-02', '2018-10-03', '2018-10-04', '2018-10-05',
'2018-10-06', '2018-10-07', '2018-10-08', '2018-10-09',
'2018-10-10', '2018-10-11', '2018-10-12', '2018-10-13',
'2018-10-14', '2018-10-15', '2018-10-16', '2018-10-17',
'2018-10-18', '2018-10-19', '2018-10-20', '2018-10-21',
'2018-10-22', '2018-10-23', '2018-10-24', '2018-10-25',
'2018-10-26', '2018-10-27', '2018-10-28', '2018-10-29',
'2018-10-30', '2018-10-31', '2018-11-01', '2018-11-02',
'2018-11-03', '2018-11-04', '2018-11-05', '2018-11-06',
'2018-11-07', '2018-11-08', '2018-11-09', '2018-11-10',
'2018-11-11', '2018-11-12', '2018-11-13', '2018-11-14',
'2018-11-15', '2018-11-16', '2018-11-17', '2018-11-18',
'2018-11-19', '2018-11-20', '2018-11-21', '2018-11-22',
'2018-11-23', '2018-11-24', '2018-11-25', '2018-11-26',
'2018-11-27', '2018-11-28', '2018-11-29', '2018-11-30',
'2018-12-01', '2018-12-02', '2018-12-03', '2018-12-04',
'2018-12-05', '2018-12-06', '2018-12-07', '2018-12-08'],

'Cost' : [1105.8097834013993, 1035.8355715930172, 2335.4700418958632,
 655.0721024605979, 1154.3067936459986, 2275.8927050269917,
 174.47816810392712,1606.0865381579742,973.1285739075876,
 677.3734705782231,2381.149891233519, 1137.840620239881,
 673.0575320194132, 1969.3783478235364, 1667.3405411738886,
 1365.707089062391, 1686.492803446683, 1613.2530220414621, 
 2275.475164597224, 1593.9382082221036, 1278.8267306408893,
 1342.2964464944962, 863.9840442789089, 289.34425736432837,
 15.219941807702485, 1595.2327617943374, 1592.8333476628231,
 961.5931139385652, 703.2690737772505, 312.9730830647801,
 2105.920303495205, 707.710807657391, 873.7377744639931,
 152.51387772605813, 1292.4027169055073, 1142.7323830723421,
 2400.462099397225, 2027.5730000421765, 2380.127923249452,
 370.97680360266463, 978.7472607817784, 144.50724935561453,
 1257.3962926696906, 339.44922335906256, 989.3364341529344,
 1274.7020560588671, 1697.9640365081489, 81.00819304765376,
 528.9126509191693, 893.839100786781, 1778.7263797734338,
 1388.1976452584615, 533.7823940180391, 1390.507110740847,
 1582.8069647428326, 2058.124928605663, 1456.0037174730746,
 315.93672830017414,488.9620970966599, 2020.6125475658266,
 1358.8988386729175,1967.1442608919235,436.40540549351783,
 2090.41730824453,2114.3435803364277,2235.719648814769,
 1773.3190866160382,2372.165649889117, 1186.850504563462,
 864.4092140750176, 772.6148714908818,1749.9856862684244,
 802.1475898419487, 1013.3410373277948, 1604.4137362997474,
 1880.084707526689, 1823.9691856540412,550.6041906641643,
 75.26104973616485, 819.9409527114842, 2272.8529542934198,
 1836.7071931445969,1491.3728333359875, 1807.2130424285615,
 2378.1185581431337,1434.1809462567153,296.49945129452675,
 2025.2054514729998,2346.234514785023, 2438.058561262957,
 277.36529451533386, 1212.541281523483,2005.258496330315,
 2053.7325650486177,2076.001012737591, 2245.606468047353,
 2493.336539619115,1116.075112703116,319.54750552662733,
 648.633853658328]}

).set_index('Day')

ppc_data.index = pd.to_datetime(ppc_data.index)


ppc_weekly = ppc_data['Cost'].resample('W').mean()
ppc_rolling_7d = ppc_data['Cost'].rolling(window=7, center=True).mean()

ax = fig.add_subplot(111)

figsize = (15,8)

ppc_data['Cost'].plot(figsize=figsize, 
                      alpha=.5, 
                      marker='.', 
                      linestyle='-', 
                      linewidth=0.5, 
                      label='Daily'
                     )

ppc_weekly.plot(figsize=figsize,
                marker='x',
                markersize=8, 
                linestyle='-',
                label='Weekly Mean Resample'
               )

ppc_rolling_7d.plot(figsize=figsize,
                   marker='o',
                   linestyle='-',
                   label='7-d Rolling Mean'
                  )

max_value = ppc_rolling_7d.max()
max_value_index = [i for i, j in enumerate(ppc_rolling_7) if j == max_value]


#Create ax customatisations
ax.annotate('Lots of Pageviews but few clicks',
            xy=(max_value_index[0],max_value),
            xytext=(max_value_index[0],max_value),
            arrowprops=dict(facecolor='cyan', #colour
                            shrink=0.05, #length of arrow
                            lw=1, #line width
                            ec='magenta', #boarder colour
                            zorder=1)) #layering order of annotation



#Global Plot settings
plt.title('COMPARE: Daily, Weekly Mean, 7-d Rolling Mean ') # set chart name
fig.legend() # set the legend

#display the charts
plt.show() 

欢迎提出任何可能是问题的建议。

1 个答案:

答案 0 :(得分:0)

感谢ImportationOfBeingErnest回答了这个问题。

使用idxmax()将快速找到最大值的索引。

x = ppc_rolling_7d.idxmax(); y = ppc_rolling_7d.max()