plt.plot 需要一个 x 坐标列表和一个同样长的 y 坐标列表。由于您似乎希望将数据框的索引用于 x 坐标,并将每个单元格内容用于 y 坐标,因此您需要将 x 值重复与 y 坐标长度一样多的次数。
请注意,这种格式不适合线图,因为连接后续点会创建一些奇怪的垂直线。 plt.plot 接受一个标记作为其第三个参数,例如 '.'在每个位置画一个简单的点。
代码示例:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
N = 30
df = pd.DataFrame({f'column{c}':
[np.random.normal(np.random.uniform(10, 100), 1, np.random.randint(3, 11)) for _ in range(N)]
for c in range(1, 6)})
legend_handles = []
colors = plt.cm.Set1.colors
desired_columns = df.columns
for column, color in zip(desired_columns, colors):
for ind, cell in df[column].iteritems():
if len(cell) > 0:
plotted, = plt.plot([ind] * len(cell), cell, '.', color=color)
legend_handles.append(plotted)
plt.legend(legend_handles, desired_columns)
plt.show()
请注意,pandas 并不是要在单元格中存储完整的数组。首选方法是以“长”形式创建一个数据框,每个值都位于单独的行中(重复“索引”)。 pandas 和 seaborn 的大部分函数都不理解单元格内的数组。
这是一种创建可以使用 Seaborn 调用的长表单的方法:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
N = 30
df = pd.DataFrame({f'column{c}':
[np.random.normal(np.random.uniform(10, 100), 1, np.random.randint(3, 11)) for _ in range(N)]
for c in range(1, 6)})
desired_columns = df.columns
df_long_data = []
for column in desired_columns:
for ind, cell in df[column].iteritems():
for val in cell:
dict = {'timestamp': ind, 'column_name': column, 'value': val}
df_long_data.append(dict)
df_long = pd.DataFrame(df_long_data)
sns.scatterplot(x='timestamp', y='value', hue='column_name', data=df_long)
plt.show()