[英]Matplotlib apply xaxis and yaxis number formatting
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用于我想要的工作-这是使nrows
和ncols
动态参数,以便我可以输出任何形状的图表想要:(4,1)形状,(2,2),(1,4)等 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_value
和position
返回格式化的字符串,如以下代码所示:
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.