如何从带有列表的 pandas DataFrame 创建绘图线图
How to create a plotly line plot from a pandas DataFrame with lists
我有一个从字典创建的 pandas DataFrame,我想从中创建一个 plotly 线图。然而,DataFrame 包含列表,看起来像这样:
a ... L
0 a_0 ... [L_00, L_01]
1 a_1 ... [L_10, L_11]
2 a_2 ... [L_20, L_21]
3 a_3 ... [L_30, L_31]
我的图应该是 L_i0
的值相对于 a_i
绘制的,但我只能创建给出列名称的图,如下所示:
fig = px.line(dataframe, x='a', y='L')
我知道我可以访问这样的值 ['L'][i][0]
然后遍历 i 但是是否可以告诉 plotly 只取列表 L 的第一个值?
示例数据框
df = pd.DataFrame({'a':[1,2,3],
'L':[[10,11,12], [20,21,22], [30,31,21]]})
导入库
import matplotlib.pyplot as plt
import pandas as pd
正在使用 pandas
创建数据框
data = [['DS', 'Linked_list', 10], ['DS', 'Stack', 9], ['DS', 'Queue', 7],
['Algo', 'Greedy', 8], ['Algo', 'DP', 6], ['Algo', 'BackTrack', 5], ]
df = pd.DataFrame(data, columns = ['Category', 'Name', 'Marks'])
绘制数字列
plt.plot(df["Marks"])
plt.xlabel
我不明白为什么,但如果你说的确实正确
[...] can only create the plot giving the name of a column like this
那么你真的应该考虑确保 df['L']
实际上只包含你想要绘制的值,而不是包含一堆其他东西的列表。但是您很可能有充分的理由完全按照自己的方式组织数据,所以我怀疑您的问题实际上是 XY problem.
但是,如果您不受限于使用 plotly.express
,那么 plotly.graph_objects
可以使用 df.iterrows()
等来实现您的目标。我假设此数据结构类似于您的真实场景:
a L
0 1 [10, 11, 12]
1 2 [20, 21, 22]
2 3 [30, 31, 21]
代码:
import pandas as pd
import plotly.graph_objects as go
df = pd.DataFrame({'a':[1,2,3],
'L':[[10,11,12], [20,21,22], [30,31,21]]})
aVals = []
LVals = []
for i, row in df.iterrows():
aVals.append(row[0])
LVals.append(row[1][0])
fig = go.Figure(go.Scatter(x=aVals, y=LVals))
fig.show()
剧情:
我读错了文档并找到了一种方法来做我想做的事情:
fig = px.line(dataframe, x='a',
y=[tupel[0] for tupel in dataframe['L']])
这将访问列表中的第一个元素,这些元素是包含在 L 中的元组。
我有一个从字典创建的 pandas DataFrame,我想从中创建一个 plotly 线图。然而,DataFrame 包含列表,看起来像这样:
a ... L
0 a_0 ... [L_00, L_01]
1 a_1 ... [L_10, L_11]
2 a_2 ... [L_20, L_21]
3 a_3 ... [L_30, L_31]
我的图应该是 L_i0
的值相对于 a_i
绘制的,但我只能创建给出列名称的图,如下所示:
fig = px.line(dataframe, x='a', y='L')
我知道我可以访问这样的值 ['L'][i][0]
然后遍历 i 但是是否可以告诉 plotly 只取列表 L 的第一个值?
示例数据框
df = pd.DataFrame({'a':[1,2,3],
'L':[[10,11,12], [20,21,22], [30,31,21]]})
导入库
import matplotlib.pyplot as plt
import pandas as pd
正在使用 pandas
创建数据框data = [['DS', 'Linked_list', 10], ['DS', 'Stack', 9], ['DS', 'Queue', 7],
['Algo', 'Greedy', 8], ['Algo', 'DP', 6], ['Algo', 'BackTrack', 5], ]
df = pd.DataFrame(data, columns = ['Category', 'Name', 'Marks'])
绘制数字列
plt.plot(df["Marks"])
plt.xlabel
我不明白为什么,但如果你说的确实正确
[...] can only create the plot giving the name of a column like this
那么你真的应该考虑确保 df['L']
实际上只包含你想要绘制的值,而不是包含一堆其他东西的列表。但是您很可能有充分的理由完全按照自己的方式组织数据,所以我怀疑您的问题实际上是 XY problem.
但是,如果您不受限于使用 plotly.express
,那么 plotly.graph_objects
可以使用 df.iterrows()
等来实现您的目标。我假设此数据结构类似于您的真实场景:
a L
0 1 [10, 11, 12]
1 2 [20, 21, 22]
2 3 [30, 31, 21]
代码:
import pandas as pd
import plotly.graph_objects as go
df = pd.DataFrame({'a':[1,2,3],
'L':[[10,11,12], [20,21,22], [30,31,21]]})
aVals = []
LVals = []
for i, row in df.iterrows():
aVals.append(row[0])
LVals.append(row[1][0])
fig = go.Figure(go.Scatter(x=aVals, y=LVals))
fig.show()
剧情:
我读错了文档并找到了一种方法来做我想做的事情:
fig = px.line(dataframe, x='a',
y=[tupel[0] for tupel in dataframe['L']])
这将访问列表中的第一个元素,这些元素是包含在 L 中的元组。