繁体   English   中英

Matplotlib应用xaxis和yaxis数字格式

[英]Matplotlib apply xaxis and yaxis number formatting

  1. 为什么我的xaxis没有格式化为日期? 我期望如此,因为我将dataframe索引设置为datetime索引。
  2. 如何使所有子图共享相同的xaxis? 我当前使用add_subplot而不是plt.subplots的原因是因为我无法让plt.subplots用于我想要的工作-这是使nrowsncols 动态参数,以便我可以输出任何形状的图表想要:(4,1)形状,(2,2),(1,4)等
  3. 如何将特定的数字格式应用于每个yaxis? 在下面,我尝试在d (字典)中查找绘图字符串以返回格式字符串,然后将该格式应用于yaxis格式,但似乎不起作用。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
plt.style.use('ggplot')

df = pd.DataFrame({'Clicks': {0: 334, 1: 554, 2: 433, 3: 5353, 4: 433},
                   'Impressions': {0: 3242, 1: 43345, 2: 3456, 3: 34543, 4: 3453},
                   'Day': {0: '12/1/2015', 1: '12/2/2015', 2: '12/3/2015', 3: '12/4/2015', 4: '12/5/2015'},
                   'Conv': {0: 23, 1: 23, 2: 45, 3: 56, 4: 45},
                   'Cost': {0: 414.16, 1: 686.96, 2: 536.91, 3: 637.72, 4: 536.91}},
                  columns=['Day', 'Impressions', 'Clicks', 'Cost', 'Conv'])

df['Day'] = pd.to_datetime(df['Day'])
df = df.set_index('Day').resample('d', how='sum')

window = 2
nrows = 2
ncols = 2

plots = ['Impressions', 'Clicks', 'Cost', 'Conv']
d = {'Impressions':'{:,.0f}', 'Clicks': '{:,.0f}', 'Cost':'${:,.2f}', 'Conv': '{:,.0f}'}

fig = plt.figure(figsize=(8,6))
for i, plot in enumerate(plots):
  ax = fig.add_subplot(nrows, ncols, i+1)
  ax.plot(df.index, df[plot])
  ma = pd.rolling_mean(df[plot], window)
  ax.plot(df.index, ma)
  mstd = pd.rolling_std(df[plot], window)
  ax.fill_between(df.index, ma - 2*mstd, ma + 2*mstd, color='b', alpha=0.1)
  ax.set_title(plot)
  ax.get_yaxis().set_major_formatter(FuncFormatter(lambda x, p: d[plot].format(x)))
  plt.tight_layout()

plt.show()

绘图示例

这是df

            Impressions  Clicks    Cost  Conv
Day                                          
2015-12-01         3242     334  414.16    23
2015-12-02        43345     554  686.96    23
2015-12-03         3456     433  536.91    45
2015-12-04        34543    5353  637.72    56
2015-12-05         3453     433  536.91    45

为什么我的xaxis没有格式化为日期?

您需要将DateFormatter (或类似major_formatter )设置为major_formatter请参见下面的代码。

如何使所有子图共享相同的xaxis?

向您的sharex=True调用添加sharex=True参数。 如果像下面的代码所示展平它们,则可以使用.subplots()轴。

如何将特定的数字格式应用于每个yaxis?

您的FuncFormatter需要从给定的tick_valueposition返回格式化的字符串,如以下代码所示:

fig, axes = plt.subplots(2, 2, figsize=(8,6), sharex=True)

for ax, plot in zip(axes.flat, plots):
    ax.plot(df.index, df[plot])
    ma = pd.rolling_mean(df[plot], window)
    ax.plot(df.index, ma)
    mstd = pd.rolling_std(df[plot], window)
    ax.fill_between(df.index, ma - 2*mstd, ma + 2*mstd, color='b', alpha=0.1)
    ax.set_title(plot)
    ax.yaxis.set_major_formatter(FuncFormatter(lambda x, p: '{:.0f}'.format(x)))
    ax.xaxis.set_major_formatter(DateFormatter('%d-%H:%M')) # or '%d.%m.%y'

fig.autofmt_xdate()  # This will rotate the xticklabels by 30 degrees so that all dates are readable.
fig.tight_layout()  # no need to call this inside the loop.

这将产生如下图:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM