gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:30:37 24 4
gpt4 key购买 nike

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

我认为这一定是我的循环,所以我尝试了多次,以确保我只循环访问名称的唯一条目。我一步一步地完成了代码,但由于我是这个库的新手,我不太确定 matplotlib 如何解释我所提供的内容。

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((resultRunningTotal)) #print_no_1

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):
listOfUniqueNames = tDF['name'].unique()
print(tDF) #print_no_2
for n in listOfUniqueNames:
tDF2 = tDF[tDF.name == n]
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]
savePlot(tempDF5)
plt.savefig(str(d)+'plot.png')

我期待它创建:

  • dfUniqueDates['date'] 中每个日期 (d) 1 个文件
  • 每个文件都包含一个简单的线图,其中:
    • 所有图表中的每个名称都以相同的颜色表示
    • 每个名称仅在键中提及一次

请参阅下面我所看到的内容:

  • 代码输出(这些是假名): /image/7s8Ge.png
  • 文件输出(您不会在图例上看到任何名称,因为出于隐私原因我已将其删除): /image/aaIo2.png

最佳答案

您将它们全部绘制在同一个图上,因此标签重复,因为您将 3 个具有相同标签的不同图放在同一个图上(因此您会看到每个标签三次)。您可以通过在最后调用 plt.show() 来看到这一点,这只会给您一个看起来像这样的图形(我将其缩小以适合我的计算机屏幕)。

enter image description here

因为您在每次迭代后都进行保存,所以您保存的图形图片随着您累积添加的内容而不同。然而,最终结果是一张图,而不是三张图。看起来您将数据设置为累积数据,因此您可以在调用 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()

当您最后调用 plt.show() 时,这将为您提供三个不同的图表,如下所示:

figure 0

figure 1

figure 2

关于python - matplotlib多次打印标签的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57537301/

24 4 0