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

Python 轴刻度日期格式化程序在折线图上工作不正常?,python,matplotlib,date-formatting,Python,Matplotlib,Date Formatting,我可以使用绘图数据绘制折线图,但x轴指示器显示不正确。因为我的数据帧有perioddatetimeindex对象,我想沿x轴正确显示它们。我尝试了几篇关于axis ticker的文章,但仍然没有正确的绘图。如何解决这个问题?有什么想法吗?谢谢 EDA数据 这是你的电话号码 我的尝试: 以下是我目前的尝试: import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates df = pd.r

我可以使用绘图数据绘制折线图,但x轴指示器显示不正确。因为我的数据帧有
period
datetimeindex
对象,我想沿x轴正确显示它们。我尝试了几篇关于axis ticker的文章,但仍然没有正确的绘图。如何解决这个问题?有什么想法吗?谢谢

EDA数据

这是你的电话号码

我的尝试

以下是我目前的尝试:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

df = 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轴指示器显示不正确。有什么想法吗?

季度
列转换为
日期时间
格式,然后设置为索引:

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()

在与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()

季度
列转换为
日期时间
格式,然后设置为索引:

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()

在与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()

最简单的方法是让熊猫做自己的事。为了在x轴上标注日期,熊猫喜欢将这些日期作为索引。只需执行
df.设置索引('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()

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

将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
将matplotlib.dates导入为mdates
将matplotlib.ticker作为mtick导入
文件名='plot_data.csv'
df=pd.read\u csv(文件名,编码='utf-8')
df.quarter=[df.quarter中d的pd.to_datetime(d.date()]
df.set_索引(“季度”,就地=真)
图,ax1=plt.子批次(图尺寸=(14,6))
_=df.div(df.Total,axis=0).iloc[:,:-1]。绘图(kind='line',ax=ax1,marker='o',ls='-->)
ax1.yaxis.set\u major\u格式化程序(mtick.PercentFormatter(xmax=1,小数=0))
ax1.xaxis.set\u major\u定位器(mdates.MonthLocator(bymonthday=1,interval=3))
ax1.xaxis.set\u major\u格式化程序(mdates.DateFormatter(“%m-%d-%Y”))
plt.xticks(旋转=45)
plt.紧_布局()
plt.show()

最简单的方法是让熊猫做自己的事。为了在x轴上标注日期,熊猫喜欢将这些日期作为索引。只需执行
df.设置索引('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()

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

将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
将matplotlib.dates导入为mdates
将matplotlib.ticker作为mtick导入
文件名='plot_data.csv'
df=pd.read\u csv(文件名,编码='utf-8')
df.quarter=[df.quarter中d的pd.to_datetime(d.date()]
df.set_索引(“季度”,就地=真)
图,ax1=plt.子批次(图尺寸=(14,6))
_=df.div(df.Total,axis=0).iloc[:,:-1]。绘图(kind='line',ax=ax1,marker='o',ls='-->)
ax1.yaxis.set\u major\u格式化程序(mtick.PercentFormatter(xmax=1,小数=0))
ax1.xaxis.set\u major\u定位器(mdates.MonthLocator(bymonthday=1,interval=3))
ax1.xaxis.set\u major\u格式化程序(mdates.DateFormatter(“%m-%d-%Y”))
plt.xticks(旋转=45)
plt.紧_布局()
plt.show()

编辑了代码并能够在x轴上绘制日期。抱歉,我不确定为什么
日期格式化程序将日期更改为完全不同的日期。可能与@beyond_Infinity有关:KT12花费了大量精力和时间试图帮助您编辑代码并能够在x轴上绘制日期。抱歉,我不知道为什么
DateFormatter
会将日期更改为完全不同的日期。可能与@beyond_inifinity有关:KT12花费了相当多的精力和时间试图帮助您,只是好奇为什么您希望在按季度显示数据的每一天?如果只是将年份显示为x轴刻度标签,看起来很不错。@VorsplungDurchtechnik不是日期而是时段,例如
2014-01-01、2014-04-01
等等。我试着按季度显示。有什么想法吗?为什么滴答在这里不起作用?我不知道DateFormatter到底是怎么回事。也许KT12已经意识到这是一个大熊猫问题。只是好奇为什么你想显示你的数据是按季度的每一天?如果只是将年份显示为x轴刻度标签,看起来很不错。@VorsplungDurchtechnik不是日期而是时段,例如
2014-01-01、2014-04-01
等等。我试着按季度显示。有什么想法吗?为什么滴答在这里不起作用?我不知道DateFormatter到底是怎么回事。也许KT12是关于这个问题的。这个图很混乱,因为理解x轴不是那么容易。这样的情节有可能吗?有什么想法吗?这个图很混乱,因为理解x轴并不容易。这样的情节有可能吗?有什么想法吗?