简体   繁体   English

Matplotlib应用xaxis和yaxis数字格式

[英]Matplotlib apply xaxis and yaxis number formatting

  1. Why is my xaxis not formatted as a date? 为什么我的xaxis没有格式化为日期? I expect it to because I am setting the dataframe index to a datetime index. 我期望如此,因为我将dataframe索引设置为datetime索引。
  2. How do I make all subplots share the same xaxis? 如何使所有子图共享相同的xaxis? The reason I am currently using add_subplot instead of plt.subplots is because I couldn't get plt.subplots to work for what I want to do -- which is to make nrows and ncols dynamic parameters so I can output charts with any shape I want: (4,1) shape, (2,2), (1,4), etc. 我当前使用add_subplot而不是plt.subplots的原因是因为我无法让plt.subplots用于我想要的工作-这是使nrowsncols 动态参数,以便我可以输出任何形状的图表想要:(4,1)形状,(2,2),(1,4)等
  3. How do I apply a specific number format to each yaxis? 如何将特定的数字格式应用于每个yaxis? Below, I am attempting to lookup the plot string in d (dict) to return the format string and then apply that format to the yaxis formatting but it doesn't seem to be working. 在下面,我尝试在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()

绘图示例

Here's the df : 这是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

Why is my xaxis not formatted as a date? 为什么我的xaxis没有格式化为日期?

You need to set DateFormatter (or similar) as major_formatter - see code below. 您需要将DateFormatter (或类似major_formatter )设置为major_formatter请参见下面的代码。

How do I make all subplots share the same xaxis? 如何使所有子图共享相同的xaxis?

Add sharex=True parameter to you subplots call. 向您的sharex=True调用添加sharex=True参数。 You can use axes from .subplots() if you flatten them like it is shown in the code below. 如果像下面的代码所示展平它们,则可以使用.subplots()轴。

How do I apply a specific number format to each yaxis? 如何将特定的数字格式应用于每个yaxis?

Your FuncFormatter needs to return a formatted string from given tick_value and position like in the code below: 您的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.

This will produce a plot like this: 这将产生如下图:

在此处输入图片说明

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

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