Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Matplotlib:在自定义格式的x轴上显示所有日期_Python 3.x_Pandas_Matplotlib - Fatal编程技术网

Python 3.x Matplotlib:在自定义格式的x轴上显示所有日期

Python 3.x Matplotlib:在自定义格式的x轴上显示所有日期,python-3.x,pandas,matplotlib,Python 3.x,Pandas,Matplotlib,使用matplotlib,我想创建一个图表,其中数据框(df)中的所有日期值都显示在x轴上。原则上,代码行plt.gca().xaxis.set\u major\u locator(matplotlib.dates.DayLocator(interval=1))应该完成这项工作,但它没有,可能是因为我使用的是自定义格式设置程序!?这里需要自定义格式设置程序,因为我会阻止matplotlib插入周末日期值,这些值不是我的dataframe()的一部分 我还想使用日期格式“%d.%m.%Y” 虽然代

使用matplotlib,我想创建一个图表,其中数据框(df)中的所有日期值都显示在x轴上。原则上,代码行
plt.gca().xaxis.set\u major\u locator(matplotlib.dates.DayLocator(interval=1))
应该完成这项工作,但它没有,可能是因为我使用的是自定义格式设置程序!?这里需要自定义格式设置程序,因为我会阻止matplotlib插入周末日期值,这些值不是我的dataframe()的一部分

我还想使用日期格式“%d.%m.%Y”

虽然代码使用matplotlib 3.3.3/Python 3.8,但我的项目必须使用matplotlib 3.2.2/Python 3.6,在这些条件下,代码不会返回所需的输出

代码如下:

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import Formatter
import pandas as pd
import numpy as np


df = pd.DataFrame(data={"col1": [1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979,
                                 1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979],
                        "date": ['2018-01-08', '2018-01-09', '2018-01-10', '2018-01-11', '2018-01-12',
                                 '2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18', '2018-01-19',
                                 '2018-01-22', '2018-01-23', '2018-01-24', '2018-01-25',]})
df["date"] = pd.to_datetime(df["date"])

class CustomFormatter(Formatter):

    def __init__(self, dates, fmt='%d.%m.%Y'):
        self.dates = dates
        self.fmt = fmt

    def __call__(self, x, pos=0):
        'Return the label for time x at position pos'
        ind = int(np.round(x))
        if ind >= len(self.dates) or ind < 0:
            return ''

        return self.dates[ind].strftime(self.fmt)

fig = plt.figure()
plt.gca().xaxis.set_major_formatter(CustomFormatter(df["date"]))
plt.plot(np.arange(df.shape[0]), df["col1"])
plt.gcf().autofmt_xdate()
#plt.gca().xaxis.set_major_locator(matplotlib.dates.DayLocator(interval=1)) # <-- this line should do the job, in theory!
导入matplotlib
将matplotlib.pyplot作为plt导入
从matplotlib.ticker导入格式化程序
作为pd进口熊猫
将numpy作为np导入
df=pd.DataFrame(data={“col1”:[1.000325,1.000807,1.001207,1.000355,1.001512,1.003237,1.000979,
1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979],
“日期”:[‘2018-01-08’、‘2018-01-09’、‘2018-01-10’、‘2018-01-11’、‘2018-01-12’,
'2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18', '2018-01-19',
'2018-01-22', '2018-01-23', '2018-01-24', '2018-01-25',]})
df[“日期”]=pd.to_datetime(df[“日期”])
类CustomFormatter(格式化程序):
定义初始化(self,dates,fmt='%d.%m.%Y'):
self.dates=日期
self.fmt=fmt
定义调用(self,x,pos=0):
'返回位置处时间x的标签'
ind=整数(np.四舍五入(x))
如果ind>=len(自日期)或ind<0:
返回“”
返回self.dates[ind].strftime(self.fmt)
图=plt.图()
plt.gca().xaxis.set\u major\u格式化程序(CustomFormatter(df[“date”]))
plt.plot(np.arange(df.shape[0]),df[“col1”])
plt.gcf().autofmtxDate()

#plt.gca().xaxis.set_major_locator(matplotlib.dates.DayLocator(interval=1))#不涉及类的问题的可能解决方案是这样做(obs!可能不需要所有导入):


不涉及类的问题的一个可能解决方案是这样做(obs!可能不需要所有导入):


由于您不是针对日期而是针对索引进行打印,因此此处的
DateLocator
可能是错误的选择:

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import Formatter, FixedLocator
import pandas as pd
import numpy as np


df = pd.DataFrame(data={"col1": [1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979,
                                 1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979],
                        "date": ['2018-01-08', '2018-01-09', '2018-01-10', '2018-01-11', '2018-01-12',
                                 '2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18', '2018-01-19',
                                 '2018-01-22', '2018-01-23', '2018-01-24', '2018-01-25',]})

df["date"] = pd.to_datetime(df["date"])


class CustomFormatter(Formatter):

    def __init__(self, dates, fmt='%d.%m.%Y'):
        self.dates = dates
        self.fmt = fmt

    def __call__(self, x, pos=0):
        'Return the label for time x at position pos'
        ind = int(np.round(x))
        if ind >= len(self.dates) or ind < 0:
            return ''

        return self.dates[ind].strftime(self.fmt)

fig = plt.figure()
plt.plot(np.arange(df.shape[0]), df["col1"])
plt.gca().xaxis.set_major_locator(FixedLocator(np.arange(df.shape[0])))
plt.gca().xaxis.set_major_formatter(CustomFormatter(df["date"]))
plt.gcf().autofmt_xdate()

#print(matplotlib.__version__)
plt.show()

输出:请参见上文

因为您不是根据日期而是根据索引进行打印,所以这里的
日期定位器可能是错误的选择:

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import Formatter, FixedLocator
import pandas as pd
import numpy as np


df = pd.DataFrame(data={"col1": [1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979,
                                 1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979],
                        "date": ['2018-01-08', '2018-01-09', '2018-01-10', '2018-01-11', '2018-01-12',
                                 '2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18', '2018-01-19',
                                 '2018-01-22', '2018-01-23', '2018-01-24', '2018-01-25',]})

df["date"] = pd.to_datetime(df["date"])


class CustomFormatter(Formatter):

    def __init__(self, dates, fmt='%d.%m.%Y'):
        self.dates = dates
        self.fmt = fmt

    def __call__(self, x, pos=0):
        'Return the label for time x at position pos'
        ind = int(np.round(x))
        if ind >= len(self.dates) or ind < 0:
            return ''

        return self.dates[ind].strftime(self.fmt)

fig = plt.figure()
plt.plot(np.arange(df.shape[0]), df["col1"])
plt.gca().xaxis.set_major_locator(FixedLocator(np.arange(df.shape[0])))
plt.gca().xaxis.set_major_formatter(CustomFormatter(df["date"]))
plt.gcf().autofmt_xdate()

#print(matplotlib.__version__)
plt.show()

输出:见上文

我认为您应该只使用日期工具,但请确保您实际绘制的是日期,而不是
np.arange(df.shape[0])

导入matplotlib
将matplotlib.pyplot作为plt导入
作为pd进口熊猫
将numpy作为np导入
df=pd.DataFrame(data={“col1”:[1.000325,1.000807,1.001207,1.000355,1.001512,1.003237,1.000979,
1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979],
“日期”:[‘2018-01-08’、‘2018-01-09’、‘2018-01-10’、‘2018-01-11’、‘2018-01-12’,
'2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18', '2018-01-19',
'2018-01-22', '2018-01-23', '2018-01-24', '2018-01-25',]})
df[“日期”]=pd.to_datetime(df[“日期”])
图,ax=plt.子批次()
ax.xaxis.set\u major\u定位器(matplotlib.dates.DayLocator(间隔=1))
ax.xaxis.set\u major\u格式化程序(matplotlib.dates.DateFormatter(“%d.%m.%Y”))
ax.绘图(df[“日期”]、df[“col1”])
图autofmt_xdate()
plt.show()

我认为您应该只使用日期工具,但要确保您实际上是在绘制日期,而不是
np.arange(df.shape[0])

导入matplotlib
将matplotlib.pyplot作为plt导入
作为pd进口熊猫
将numpy作为np导入
df=pd.DataFrame(data={“col1”:[1.000325,1.000807,1.001207,1.000355,1.001512,1.003237,1.000979,
1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979],
“日期”:[‘2018-01-08’、‘2018-01-09’、‘2018-01-10’、‘2018-01-11’、‘2018-01-12’,
'2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18', '2018-01-19',
'2018-01-22', '2018-01-23', '2018-01-24', '2018-01-25',]})
df[“日期”]=pd.to_datetime(df[“日期”])
图,ax=plt.子批次()
ax.xaxis.set\u major\u定位器(matplotlib.dates.DayLocator(间隔=1))
ax.xaxis.set\u major\u格式化程序(matplotlib.dates.DateFormatter(“%d.%m.%Y”))
ax.绘图(df[“日期”]、df[“col1”])
图autofmt_xdate()
plt.show()

谢谢您的回答!不幸的是,我不能在这个项目中使用seaborn。我需要一个完全基于matplotlib的解决方案。谢谢您的回答!不幸的是,我不能在这个项目中使用seaborn。我需要一个完全基于matplotlib的解决方案。非常感谢您的精彩回答!很高兴看到我不必使用愚蠢的CustomFormatter。是的,我知道这是一个非常专业的问题。但我必须使用matplotlib 3.2.2,因为它是fbs软件包(使用pyinstaller)支持的版本。该评论不是针对您的-当我最初运行您的代码时,我想知道您的问题是什么。所以,万一有人读到它,我想确保这是一个版本问题。我还将把这个问题包括在你的问题中,以强调这个问题。非常感谢你出色的回答!很高兴看到我不必使用愚蠢的CustomFormatter。是的,我知道这是一个非常专业的问题。但我必须使用matplotlib 3.2.2,因为它是fbs软件包(使用pyinstaller)支持的版本。该评论不是针对您的-当我最初运行您的代码时,我想知道您的问题是什么。所以,万一有人读到它,我想确保这是一个版本问题。我也会
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import FixedLocator
import pandas as pd
import numpy as np


df = pd.DataFrame(data={"col1": [1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979,
                                 1.000325, 1.000807, 1.001207, 1.000355, 1.001512, 1.003237, 1.000979],
                        "date": ['2018-01-08', '2018-01-09', '2018-01-10', '2018-01-11', '2018-01-12',
                                 '2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18', '2018-01-19',
                                 '2018-01-22', '2018-01-23', '2018-01-24', '2018-01-25',]})

df["date"] = pd.to_datetime(df["date"])


fig = plt.figure()
plt.plot(np.arange(df.shape[0]), df["col1"])
plt.gca().xaxis.set_major_locator(FixedLocator(np.arange(df.shape[0])))
plt.xticks(np.arange(df.shape[0]), df["date"].dt.strftime("%d.%m.%Y"))
plt.gcf().autofmt_xdate()

#print(matplotlib.__version__)
plt.show()