Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.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 matplotlib多次打印标签的原因是什么?_Python_Pandas_Matplotlib - Fatal编程技术网

Python matplotlib多次打印标签的原因是什么?

Python matplotlib多次打印标签的原因是什么?,python,pandas,matplotlib,Python,Pandas,Matplotlib,我正在尝试编写python代码,它将获取我的数据,并为x轴上的每个条目创建一个输出到png文件的图形。因此,我可以稍后在整个时间内设置进度动画。然而,出于某种原因,我的代码在输出文件时,会多次读取每个绘图 我想这一定是我的循环,所以我多次尝试确保我只循环名称的唯一条目。我一步一步地阅读了代码,但鉴于我对这个库还不熟悉,我不确定matplotlib是如何解释我提供给它的内容的 将熊猫作为pa导入 从日期时间导入日期时间 将matplotlib.pyplot作为plt导入 数据=['2018-10-

我正在尝试编写python代码,它将获取我的数据,并为x轴上的每个条目创建一个输出到png文件的图形。因此,我可以稍后在整个时间内设置进度动画。然而,出于某种原因,我的代码在输出文件时,会多次读取每个绘图

我想这一定是我的循环,所以我多次尝试确保我只循环名称的唯一条目。我一步一步地阅读了代码,但鉴于我对这个库还不熟悉,我不确定matplotlib是如何解释我提供给它的内容的

将熊猫作为pa导入
从日期时间导入日期时间
将matplotlib.pyplot作为plt导入
数据=['2018-10-29',53',安娜·史密斯'],['2018-10-30',118',安娜·史密斯'],['2018-10-31',142',安娜·史密斯'],['2018-10-31',7',多米尼克·史密斯'],['2018-10-30',1',无名',['2018-10-29',33',杰德·史密斯',['2018-10-30',103',杰德·史密斯',['2018-10-31',105',杰德·史密斯',['2018-10-29',41',乔安娜·史密斯',['2018-10-30',169乔安娜·史密斯'],[2018-10-31',220',乔安娜·史密斯'],[2018-10-29',31',约翰·史密斯'],[2018-10-30',61',约翰·史密斯'],[2018-10-31',79',约翰·史密斯'],[2018-10-29',44',纳塔利·史密斯',[2018-10-30',100',纳塔利·史密斯',[2018-10-31',120',纳塔利·史密斯',[2018-10-30',25',塞巴斯蒂安·史密斯',[2018-10-31',47',塞巴斯蒂安·史密斯',['2018-10-29',52',Veronica Smith'],['2018-10-30',74',Veronica Smith'],['2018-10-31',77',Veronica Smith']
resultRunningTotal=pa.DataFrame(数据,列=['date','runningTotal','name'])
resultRunningTotal['date']=pa.to_datetime(resultRunningTotal['date']).dt.date
打印((结果汇总))#打印第1号
plt.图(figsize=(24,13.5))
TuniqueDates=resultRunningTotal['date'][~resultRunningTotal.duplicated(['date'])]
dfUniqueDates=pa.DataFrame(TuniqueDates)
dfUniqueDates.sort_值(按=['date'],就地=True,升序=True)
startDate=min(数据唯一日期['date'])
def保存图(tDF):
listOfUniqueNames=tDF['name'].unique()
打印(tDF)#打印第2号
对于列表中的n:
tDF2=tDF[tDF.name==n]
tDF2.plot(kind='line',x='date',y='runningTotal',ax=plt.gca(),线宽=3,标签=n)
对于dfUniqueDates['date']中的d:

mask=(resultRunningTotal['date']>=startDate)和(resultRunningTotal['date']]您正在将它们全部打印在同一个图形上,因此标签会重复,因为您正在同一个图形上放置3个具有相同标签的不同绘图(因此每个标签会显示三次)。您可以通过调用
plt.show()来查看这一点
最后,它只给出了一个像这样的图形(我将其向下揉以适合我的电脑屏幕)

因为每次迭代后都要保存,所以保存的图形图片在累积添加时会有所不同。但是,最终结果是一个图形,而不是三个。看起来您将数据设置为累积,以便在调用
tDF2.plot()之前使用
plt.figure()
停止重复标签
。如下所示:

import pandas as pa
from datetime import datetime
import matplotlib.pyplot as plt



data = [['2018-10-29', 53, 'Anna Smith'],['2018-10-30', 118, 'Anna Smith'],['2018-10-31', 142, 'Anna Smith'],['2018-10-31', 7, 'Dominic Smith'],['2018-10-30', 1, 'Unknown Name'],['2018-10-29', 33, 'Jade Smith'],['2018-10-30', 103, 'Jade Smith'],['2018-10-31', 105, 'Jade Smith'],['2018-10-29', 41, 'Joanna Smith'],['2018-10-30', 169, 'Joanna Smith'],['2018-10-31', 220, 'Joanna Smith'],['2018-10-29', 31, 'John Smith'],['2018-10-30', 61, 'John Smith'],['2018-10-31', 79, 'John Smith'],['2018-10-29', 44, 'Nataly Smith'],['2018-10-30', 100, 'Nataly Smith'],['2018-10-31', 120, 'Nataly Smith'],['2018-10-30', 25, 'Sebastian Smith'],['2018-10-31', 47, 'Sebastian Smith'],['2018-10-29', 52, 'Veronica Smith'],['2018-10-30', 74, 'Veronica Smith'],['2018-10-31', 77, 'Veronica Smith']]
resultRunningTotal = pa.DataFrame(data, columns = ['date', 'runningTotal','name']) 
resultRunningTotal['date'] = pa.to_datetime(resultRunningTotal['date']).dt.date
print(type(resultRunningTotal))
print(resultRunningTotal.dtypes)

plt.figure(figsize=(24,13.5))
TuniqueDates = resultRunningTotal['date'][~resultRunningTotal.duplicated(['date'])]
dfUniqueDates = pa.DataFrame(TuniqueDates)
dfUniqueDates.sort_values(by=['date'], inplace=True, ascending=True)
startDate = min(dfUniqueDates['date'])

def savePlot (tDF, fig):
   listOfUniqueNames = tDF['name'].unique() 
   #print(tDF) #print_no_2
   for n in listOfUniqueNames:
      tDF2 = tDF[tDF.name == n]
      plt.figure(fig)
      tDF2.plot(kind='line',x='date',y='runningTotal',ax=plt.gca(),linewidth=3,label = n)

for d in dfUniqueDates['date']:
    mask = (resultRunningTotal['date'] >= startDate) & (resultRunningTotal['date'] <= d)
    tempDF5 = resultRunningTotal.loc[mask]
    fig_num = dfUniqueDates['date'].tolist().index(d)
    savePlot(tempDF5, fig_num)
    plt.savefig(str(d)+'plot.png')
plt.show()
将熊猫作为pa导入
从日期时间导入日期时间
将matplotlib.pyplot作为plt导入
数据=['2018-10-29',53',安娜·史密斯'],['2018-10-30',118',安娜·史密斯'],['2018-10-31',142',安娜·史密斯'],['2018-10-31',7',多米尼克·史密斯'],['2018-10-30',1',无名',['2018-10-29',33',杰德·史密斯',['2018-10-30',103',杰德·史密斯',['2018-10-31',105',杰德·史密斯',['2018-10-29',41',乔安娜·史密斯',['2018-10-30',169乔安娜·史密斯'],[2018-10-31',220',乔安娜·史密斯'],[2018-10-29',31',约翰·史密斯'],[2018-10-30',61',约翰·史密斯'],[2018-10-31',79',约翰·史密斯'],[2018-10-29',44',纳塔利·史密斯',[2018-10-30',100',纳塔利·史密斯',[2018-10-31',120',纳塔利·史密斯',[2018-10-30',25',塞巴斯蒂安·史密斯',[2018-10-31',47',塞巴斯蒂安·史密斯',['2018-10-29',52',Veronica Smith'],['2018-10-30',74',Veronica Smith'],['2018-10-31',77',Veronica Smith']
resultRunningTotal=pa.DataFrame(数据,列=['date','runningTotal','name'])
resultRunningTotal['date']=pa.to_datetime(resultRunningTotal['date']).dt.date
打印(类型(结果汇总))
打印(resultRunningTotal.d类型)
plt.图(figsize=(24,13.5))
TuniqueDates=resultRunningTotal['date'][~resultRunningTotal.duplicated(['date'])]
dfUniqueDates=pa.DataFrame(TuniqueDates)
dfUniqueDates.sort_值(按=['date'],就地=True,升序=True)
startDate=min(数据唯一日期['date'])
def保存图(tDF,图):
listOfUniqueNames=tDF['name'].unique()
#打印(tDF)#打印第2号
对于列表中的n:
tDF2=tDF[tDF.name==n]
plt.图(图)
tDF2.plot(kind='line',x='date',y='runningTotal',ax=plt.gca(),线宽=3,标签=n)
对于dfUniqueDates['date']中的d:

mask=(resultRunningTotal['date']>=startDate)和(resultRunningTotal['date']]您正在将它们全部打印在同一个图形上,因此标签会重复,因为您正在同一个图形上放置3个具有相同标签的不同绘图(因此每个标签会显示三次)。您可以通过调用
plt.show()来查看这一点
最后,它只给出了一个像这样的图形(我将其向下揉以适合我的电脑屏幕)

因为每次迭代后都要保存,所以保存的图形图片在累积添加时会有所不同。但是,最终结果是一个图形,而不是三个。看起来您将数据设置为累积,以便在调用
tDF2.plot()之前使用
plt.figure()
停止重复标签
。如下所示:

import pandas as pa
from datetime import datetime
import matplotlib.pyplot as plt



data = [['2018-10-29', 53, 'Anna Smith'],['2018-10-30', 118, 'Anna Smith'],['2018-10-31', 142, 'Anna Smith'],['2018-10-31', 7, 'Dominic Smith'],['2018-10-30', 1, 'Unknown Name'],['2018-10-29', 33, 'Jade Smith'],['2018-10-30', 103, 'Jade Smith'],['2018-10-31', 105, 'Jade Smith'],['2018-10-29', 41, 'Joanna Smith'],['2018-10-30', 169, 'Joanna Smith'],['2018-10-31', 220, 'Joanna Smith'],['2018-10-29', 31, 'John Smith'],['2018-10-30', 61, 'John Smith'],['2018-10-31', 79, 'John Smith'],['2018-10-29', 44, 'Nataly Smith'],['2018-10-30', 100, 'Nataly Smith'],['2018-10-31', 120, 'Nataly Smith'],['2018-10-30', 25, 'Sebastian Smith'],['2018-10-31', 47, 'Sebastian Smith'],['2018-10-29', 52, 'Veronica Smith'],['2018-10-30', 74, 'Veronica Smith'],['2018-10-31', 77, 'Veronica Smith']]
resultRunningTotal = pa.DataFrame(data, columns = ['date', 'runningTotal','name']) 
resultRunningTotal['date'] = pa.to_datetime(resultRunningTotal['date']).dt.date
print(type(resultRunningTotal))
print(resultRunningTotal.dtypes)

plt.figure(figsize=(24,13.5))
TuniqueDates = resultRunningTotal['date'][~resultRunningTotal.duplicated(['date'])]
dfUniqueDates = pa.DataFrame(TuniqueDates)
dfUniqueDates.sort_values(by=['date'], inplace=True, ascending=True)
startDate = min(dfUniqueDates['date'])

def savePlot (tDF, fig):
   listOfUniqueNames = tDF['name'].unique() 
   #print(tDF) #print_no_2
   for n in listOfUniqueNames:
      tDF2 = tDF[tDF.name == n]
      plt.figure(fig)
      tDF2.plot(kind='line',x='date',y='runningTotal',ax=plt.gca(),linewidth=3,label = n)

for d in dfUniqueDates['date']:
    mask = (resultRunningTotal['date'] >= startDate) & (resultRunningTotal['date'] <= d)
    tempDF5 = resultRunningTotal.loc[mask]
    fig_num = dfUniqueDates['date'].tolist().index(d)
    savePlot(tempDF5, fig_num)
    plt.savefig(str(d)+'plot.png')
plt.show()
将熊猫作为pa导入
从日期时间导入日期时间
将matplotlib.pyplot作为plt导入
数据=['2018-10-29',53',安娜史密斯'],['2018-10-30',118',安娜史密斯'],['2018-10-31',142',安娜史密斯'],['2018-10-31',7',多米尼克史密斯'],['2018-10-30',1',未知姓名',['2018-10-29',33',杰德史密斯',['2018-10-30',103',杰德史密斯',['2018-10-31',105',杰德史密斯',['2018-10-29',41',乔安娜史密斯',['2018-10-30',乔安娜史密斯'