为了账号安全,请及时绑定邮箱和手机立即绑定

轴刻度日期格式化程序在折线图上无法正常工作?

轴刻度日期格式化程序在折线图上无法正常工作?

qq_遁去的一_1 2022-07-19 20:12:34
我可以使用我的绘图数据来呈现折线图,但 x 轴代码显示不正确。因为我的数据框有period datetimeindex对象,我想正确地沿 x 轴显示它们。我尝试了几个现有的帖子,axis ticker但仍然没有正确的情节。如何解决这个问题?任何想法?谢谢EDA 数据这是关于 gist 的绘图数据我的尝试:这是我目前的尝试:import pandas as pdimport matplotlib.pyplot as pltimport matplotlib.dates as mdatesdf = pd.read_csv('plot_data.csv', encoding='utf-8')df.div(df.Total, axis=0).applymap(lambda x: f'{x * 100:.2f}%')fig, ax1 = plt.subplots(figsize=(14,6))_ = df.div(df.Total, axis=0).iloc[:, :-1].plot(kind='line', ax=ax1, ax=ax1, marker='o',ls='--')ax1.yaxis.set_major_formatter(FuncFormatter(lambda y, _: '{:.0%}'.format(y))) ax1.xaxis.set_major_locator(mdates.DayLocator())ax1.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d-%Y'))plt.show()目标我想渲染一个折线图,其中 y 轴应该显示百分比,而 x 轴应该正确显示年份的周期。在我的代码中,x 轴代码显示不正确。任何想法?
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

最简单的就是让熊猫做它的事。为了在 x 轴上显示日期,pandas 喜欢将这些日期作为索引。做吧df.set_index('quarter', inplace=True)。


有了这样的索引,pandas 将设置一个看起来像日期的 x 轴,但实际上是一个分类轴(编号为 0、1、2、3、...),其中 pandas 提供了刻度标签。


要设置百分比,请使用PercentFormatter, 和参数设置 100%(为 1,而不是默认的 100)和小数位数。


import pandas as pd

import matplotlib.pyplot as plt

import matplotlib.dates as mdates

import matplotlib.ticker as mtick


filename = 'plot_data.csv'

df = pd.read_csv(filename, encoding='utf-8')

df.set_index('quarter', inplace=True)

fig, ax1 = plt.subplots(figsize=(14, 6))

df.div(df.Total, axis=0).iloc[:, :-1].plot(kind='line', ax=ax1, marker='o', ls='--')

ax1.yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1, decimals=0))

plt.xticks(range(len(df.index)), df.index, rotation=90)

plt.show()

//img1.sycdn.imooc.com//62d69fe6000198f315991010.jpg

或者,您可以将索引转换为 matplotlib 日期并使用 matplotlib 的格式和定位器:


import pandas as pd

import matplotlib.pyplot as plt

import matplotlib.dates as mdates

import matplotlib.ticker as mtick


filename = 'plot_data.csv'

df = pd.read_csv(filename, encoding='utf-8')

df.quarter = [pd.to_datetime(d).date() for d in df.quarter]

df.set_index('quarter', inplace=True)

fig, ax1 = plt.subplots(figsize=(14, 6))

_ = df.div(df.Total, axis=0).iloc[:, :-1].plot(kind='line', ax=ax1, marker='o', ls='--')

ax1.yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1, decimals=0))

ax1.xaxis.set_major_locator(mdates.MonthLocator(bymonthday=1, interval=3))

ax1.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d-%Y'))

plt.xticks(rotation=45)

plt.tight_layout()

plt.show()

//img1.sycdn.imooc.com//62d69ff200019f5917660885.jpg

查看完整回答
反对 回复 2022-07-19
?
慕神8447489

TA贡献1780条经验 获得超1个赞

该quarter列被转换为datetime格式,然后设置为索引:


import matplotlib.dates as mdates


df = pd.read_csv('plot_data.csv', encoding='utf-8')

df['quarter'] = pd.to_datetime(df['quarter'], format='%Y-%m-%d')

df = df.set_index(df['quarter'])

df = df.sort_index()

fig, ax1 = plt.subplots(figsize=(14,6))

_ = df.drop('quarter', axis=1).div(df.Total, axis=0).iloc[:, :-1].plot(kind='line', ax=ax1)

ax1.yaxis.set_major_formatter(plt.FuncFormatter(lambda y, _: '{:.0%}'.format(y))) 

ax1.set_xticks(df.index)

ax1.xaxis_date()

plt.show()

//img1.sycdn.imooc.com//62d69fff000150c908910384.jpg

在与 matplotlib 斗争之后,我找到了使用 seaborn 的解决方案。


import matplotlib.ticker as mtick

import seaborn as sns

sns.set()

df = pd.read_csv('plot_data.csv', encoding='utf-8')

df['quarter'] = pd.to_datetime(df['quarter'], format='%Y-%m-%d')

df = df.set_index(df['quarter'])

df = df.sort_index()

df_clean = df.drop('quarter', axis=1).div(df.Total, axis=0)

df_clean.drop('Total', axis=1, inplace=True)

df_us = df_clean.unstack().reset_index().copy()

df_us = df_us.rename(columns={'level_0':'Country', 0:'Percent'})

g = sns.lineplot(data=df_us, x='quarter', y='Percent', hue='Country')

g.set(xticks=df.index)

plt.xticks(rotation=30)

g.yaxis.set_major_formatter(plt.FuncFormatter(lambda y, _: '{:.0%}'.format(y)))

plt.savefig('sns.png')

plt.show()

//img1.sycdn.imooc.com//62d6a00b00016feb04030289.jpg

查看完整回答
反对 回复 2022-07-19
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号