在Python中移动绘图

时间:2018-03-09 14:13:08

标签: python python-3.x matplotlib

我想在python中绘制两个列表,一个是test1,另一个是predictions1

我希望绘制test1列表的前150个条目,然后绘制predictions1列表的条目101-150,以便两个图相互叠加。这是我试过的:

import matplotlib.pyplot as plt
plt.figure(figsize=(15,8))
plt.plot(test1[1:150])
plt.plot(predictions1[101:150], color='red')
plt.show()

但我得到了结果: enter image description here

显然,这不是我想达到的目标,因为我希望红色的地块能够叠加在蓝色的地块上。请帮忙。

2 个答案:

答案 0 :(得分:2)

我们的想法是创建一个数字列表,用作x数据,从0到150:

x_data = range(150)

然后slice这样,对于第一组数据,x轴使用数字0到149.然后需要切割第二组数据以使用数字100到149.

plt.plot(x_data[:], test1[:150])
plt.plot(x_data[100:], predictions1[100:150], color='red')

请注意,Python索引从0开始,而不是1

答案 1 :(得分:1)

此建议适用于任何类型的索引值(字符串,日期或整数),只要它们是唯一的。

简答:

创建最长系列的pandas数据框。此数据框将具有索引。从该系列中获取最后的 50 索引值,并将其与新数据框中的预测值相关联。您的两个数据帧将具有不同的长度,因此您必须将它们merge放在一起才能获得两个相同长度的系列。使用这种方法,您的预测值的前100个值将为空,但您的数据将具有关联的索引,以便您可以针对test1系列绘制它。

详细信息:

由于您没有共享可重现的数据集,因此我制作了一些与数据集结构相匹配的随机数据。下面的第一个代码段将重现您的情况,并为建议的解决方案提供两个数组 test1 和** predictions1 **。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(123456)
rows = 150
df = pd.DataFrame(np.random.randint(-4,5,size=(rows, 1)), columns=['test1'])
datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist()
df['dates'] = datelist 
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)
df['test1'] = df['test1'].cumsum()

# Get the last 50 values of test1 (as array instead of dataframe)
# to mimic the names and data types of your source data 
test1 = df['test1'].values
predicionts1 = df['test1'].tail(50).values
predictions1 = predicionts1*1.1

# Reproducing your situation:
import matplotlib.pyplot as plt
plt.figure(figsize=(15,8))
plt.plot(test1)
plt.plot(predictions1, color = 'red')
plt.show()

enter image description here

以下代码段将在test1上叠加预测1:

# Make a new dataframe of your prediction values
df_new = pd.DataFrame(test1)
df_new.columns = ['test1']

# Retrieve index values
new_index = df_new['test1'].tail(len(predictions1)).index

# Make a dataframe with your prediction values and your index
new_series = pd.DataFrame(index = new_index, data = predictions1)

# Merge the dataframes
df_new = pd.merge(df_new, new_series, how = 'left', left_index=True, right_index=True)
df_new.columns = ['test1', 'predictions1']

# And plot it
import matplotlib.pyplot as plt
plt.figure(figsize=(15,8))
plt.plot(df_new['test1'])
plt.plot(df_new['predictions1'], color = 'red')
plt.show()

enter image description here