如何循环在 Plotly 中创建子图,其中每个子图都有几条曲线?
how to loop to create subplots in Plotly, where each subplot has a few curves on it?
我已经在下面编写了嵌套循环以成功生成 21 个图表(每个国家一个图表,例如 german gas austrian gas)
dfs 是一个字典,以 21 个国家名称为键,以其各自的 gas 存储 dfs 为值
for country in list(dfs_storage.keys()):
df_country=dfs_storage[country]
month = list(set(df_country['month']))
fig = go.Figure()
for year in set(df_country['year']):
workingGasVolume_peryear=df_country.loc[df_country['year']==year,'workingGasVolume']
gasInStorage_peryear=df_country.loc[df_country['year']==year,'gasInStorage']
# Create and style traces
fig.add_trace(go.Scatter(x=month, y=workingGasVolume_peryear, name=f'workingGasVolume{year}',
line=dict(width=4,dash='dash')))
fig.add_trace(go.Scatter(x=month, y=gasInStorage_peryear, name=f'gasInStorage{year}',
line = dict(width=4)))
# Edit the layout
fig.update_layout(title=f'{country} workingGasVolume gasInStorage',
xaxis_title='Month',
yaxis_title='Gas Volume')
offline.plot({'data':fig},filename=f'{country} gas storage.html',auto_open=False)
现在要求我将这 21 个图表放在一个 HTML 文件中而不更改每个图表,例如它们可以一个接一个地垂直显示
我用下面的代码尝试了 "subplots" 和 Plotly 并修改了几次,但从来没有得到想要的图表,我得到了一个无用的图表,我看不到任何值..任何人都可以帮助我?谢谢
countries=[]
for country in list(dfs_storage.keys()):
countries.append(country)
fig = make_subplots(
rows=len(list(dfs_storage.keys())),cols=1,
subplot_titles=(countries))
for country in countries:
df_country=dfs_storage[country]
month = list(set(df_country['month']))
for year in set(df_country['year']):
workingGasVolume_peryear=df_country.loc[df_country['year']==year,'workingGasVolume']
gasInStorage_peryear=df_country.loc[df_country['year']==year,'gasInStorage']
# Create and style traces
fig.add_trace(go.Scatter(x=month, y=workingGasVolume_peryear, name=f'workingGasVolume{year}',
line=dict(width=4,dash='dash')))
fig.add_trace(go.Scatter(x=month, y=gasInStorage_peryear, name=f'gasInStorage{year}',
line = dict(width=4)))
# Edit the layout
# fig.update_layout(title='workingGasVolume gasInStorage',
# xaxis_title='Month',
# yaxis_title='Gas Volume')
offline.plot({'data':fig},filename='gas storage.html',auto_open=False)
6 月 7 日编辑:根据 jayveesea 的建议,我在 add_trace 下添加了 row 和 col 参数,代码如下但仍然有 Traceback:
countries=[]
for country in list(dfs_storage.keys()):
countries.append(country)
fig = make_subplots(
rows=len(list(dfs_storage.keys())),cols=1,
subplot_titles=(countries))
for i in range(len(countries)):
country=countries[i]
df_country=dfs_storage[country]
month = list(set(df_country['month']))
for year in set(df_country['year']):
workingGasVolume_peryear=df_country.loc[df_country['year']==year,'workingGasVolume']
gasInStorage_peryear=df_country.loc[df_country['year']==year,'gasInStorage']
# Create and style traces
fig.add_trace(go.Scatter(x=month, y=workingGasVolume_peryear, name=f'workingGasVolume{year}',row=i,col=1,
line=dict(width=4,dash='dash')))
fig.add_trace(go.Scatter(x=month, y=gasInStorage_peryear, name=f'gasInStorage{year}',row=i,col=1,
line = dict(width=4)))
# Edit the layout
# fig.update_layout(title='workingGasVolume gasInStorage',
# xaxis_title='Month',
# yaxis_title='Gas Volume')
offline.plot({'data':fig},filename='gas storage.html',auto_open=False)
print('the Plotly charts are saved in the same folder as the Python code')
编辑 6 月 8 日:
这是我现在 运行 的代码,从@jayveesea 的答案中复制过来,只修改了 df
的名称
countries=[]
for country in list(dfs_storage.keys()):
countries.append(country)
# STEP 1
fig = make_subplots(
rows=len(countries), cols=1,
subplot_titles=(countries))
for i, country in enumerate(countries): #enumerate here to get access to i
years = df_country.year[df_country.country==country].unique()
for yrs in years:
focus = (df_country.country==country) & (df_country.year==yrs)
month = df_country.month[focus]
workingGasVolume_peryear = df_country.workingGasVolume[focus]
gasInStorage_peryear = df_country.gasInStorage[focus]
# STEP 2, notice position of arguments!
fig.add_trace(go.Scatter(x=month,
y=workingGasVolume_peryear,
name=f'workingGasVolume{yrs}',
line=dict(width=4,dash='dash')),
row=i+1, #index for the subplot, i+1 because plotly starts with 1
col=1)
fig.add_trace(go.Scatter(x=month,
y=gasInStorage_peryear,
name=f'gasInStorage{yrs}',
line = dict(width=4)),
row=i+1,
col=1)
fig.show()
但我仍然有回溯信息
Traceback (most recent call last):
File "<ipython-input-27-513826172e49>", line 43, in <module>
line=dict(width=4,dash='dash')),
TypeError: 'dict' object is not callable
要在 plotly 中使用子图,您需要:
- 使用
make_subplots
初始化布局指定row
和column
- 然后使用
row
和 col
作为 fig.add_trace
的参数。注意:子图的行和列从 1(不是零)开始
在您的情况下,第 2 步是您卡住的地方。最初这部分缺失(第一个 post),但现在在您的更新中它被添加为 go.Scatter
的参数。仔细查看 the examples here,因为区别只是逗号和括号及其位置。
为了澄清,这个:
fig.add_trace(go.Scatter(x=month,
y=workingGasVolume_peryear,
name=f'workingGasVolume{year}',
row=i,
col=1,
line=dict(width=4,dash='dash')))
应该是:
fig.add_trace(go.Scatter(x=month,
y=workingGasVolume_peryear,
name=f'workingGasVolume{year}',
line=dict(width=4,dash='dash')),
row=i+1,
col=1)
我在使用你的代码和数据时遇到困难,这可能是我的问题,因为我不使用这样的字典,但这里有一个工作示例,你的数据在 csv 中并使用 pandas
.还有,我把其中的某一年换成了不同的国家,这样就有了另外的情节。
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
df = pd.read_csv('someData.csv')
countries = df.country.unique()
# STEP 1
fig = make_subplots(
rows=len(countries), cols=1,
subplot_titles=(countries))
for i, country in enumerate(countries): #enumerate here to get access to i
years = df.year[df.country==country].unique()
for yrs in years:
focus = (df.country==country) & (df.year==yrs)
month = df.month[focus]
workingGasVolume_peryear = df.workingGasVolume[focus]
gasInStorage_peryear = df.gasInStorage[focus]
# STEP 2, notice position of arguments!
fig.add_trace(go.Scatter(x=month,
y=workingGasVolume_peryear,
name=f'workingGasVolume{yrs}',
line=dict(width=4,dash='dash')
),
row=i+1, #index for the subplot, i+1 because plotly starts with 1
col=1)
fig.add_trace(go.Scatter(x=month,
y=gasInStorage_peryear,
name=f'gasInStorage{yrs}',
line = dict(width=4)),
row=i+1,
col=1)
fig.show()
我已经在下面编写了嵌套循环以成功生成 21 个图表(每个国家一个图表,例如 german gas austrian gas)
dfs 是一个字典,以 21 个国家名称为键,以其各自的 gas 存储 dfs 为值
for country in list(dfs_storage.keys()):
df_country=dfs_storage[country]
month = list(set(df_country['month']))
fig = go.Figure()
for year in set(df_country['year']):
workingGasVolume_peryear=df_country.loc[df_country['year']==year,'workingGasVolume']
gasInStorage_peryear=df_country.loc[df_country['year']==year,'gasInStorage']
# Create and style traces
fig.add_trace(go.Scatter(x=month, y=workingGasVolume_peryear, name=f'workingGasVolume{year}',
line=dict(width=4,dash='dash')))
fig.add_trace(go.Scatter(x=month, y=gasInStorage_peryear, name=f'gasInStorage{year}',
line = dict(width=4)))
# Edit the layout
fig.update_layout(title=f'{country} workingGasVolume gasInStorage',
xaxis_title='Month',
yaxis_title='Gas Volume')
offline.plot({'data':fig},filename=f'{country} gas storage.html',auto_open=False)
现在要求我将这 21 个图表放在一个 HTML 文件中而不更改每个图表,例如它们可以一个接一个地垂直显示
我用下面的代码尝试了 "subplots" 和 Plotly 并修改了几次,但从来没有得到想要的图表,我得到了一个无用的图表,我看不到任何值..任何人都可以帮助我?谢谢
countries=[]
for country in list(dfs_storage.keys()):
countries.append(country)
fig = make_subplots(
rows=len(list(dfs_storage.keys())),cols=1,
subplot_titles=(countries))
for country in countries:
df_country=dfs_storage[country]
month = list(set(df_country['month']))
for year in set(df_country['year']):
workingGasVolume_peryear=df_country.loc[df_country['year']==year,'workingGasVolume']
gasInStorage_peryear=df_country.loc[df_country['year']==year,'gasInStorage']
# Create and style traces
fig.add_trace(go.Scatter(x=month, y=workingGasVolume_peryear, name=f'workingGasVolume{year}',
line=dict(width=4,dash='dash')))
fig.add_trace(go.Scatter(x=month, y=gasInStorage_peryear, name=f'gasInStorage{year}',
line = dict(width=4)))
# Edit the layout
# fig.update_layout(title='workingGasVolume gasInStorage',
# xaxis_title='Month',
# yaxis_title='Gas Volume')
offline.plot({'data':fig},filename='gas storage.html',auto_open=False)
6 月 7 日编辑:根据 jayveesea 的建议,我在 add_trace 下添加了 row 和 col 参数,代码如下但仍然有 Traceback:
countries=[]
for country in list(dfs_storage.keys()):
countries.append(country)
fig = make_subplots(
rows=len(list(dfs_storage.keys())),cols=1,
subplot_titles=(countries))
for i in range(len(countries)):
country=countries[i]
df_country=dfs_storage[country]
month = list(set(df_country['month']))
for year in set(df_country['year']):
workingGasVolume_peryear=df_country.loc[df_country['year']==year,'workingGasVolume']
gasInStorage_peryear=df_country.loc[df_country['year']==year,'gasInStorage']
# Create and style traces
fig.add_trace(go.Scatter(x=month, y=workingGasVolume_peryear, name=f'workingGasVolume{year}',row=i,col=1,
line=dict(width=4,dash='dash')))
fig.add_trace(go.Scatter(x=month, y=gasInStorage_peryear, name=f'gasInStorage{year}',row=i,col=1,
line = dict(width=4)))
# Edit the layout
# fig.update_layout(title='workingGasVolume gasInStorage',
# xaxis_title='Month',
# yaxis_title='Gas Volume')
offline.plot({'data':fig},filename='gas storage.html',auto_open=False)
print('the Plotly charts are saved in the same folder as the Python code')
编辑 6 月 8 日: 这是我现在 运行 的代码,从@jayveesea 的答案中复制过来,只修改了 df
的名称countries=[]
for country in list(dfs_storage.keys()):
countries.append(country)
# STEP 1
fig = make_subplots(
rows=len(countries), cols=1,
subplot_titles=(countries))
for i, country in enumerate(countries): #enumerate here to get access to i
years = df_country.year[df_country.country==country].unique()
for yrs in years:
focus = (df_country.country==country) & (df_country.year==yrs)
month = df_country.month[focus]
workingGasVolume_peryear = df_country.workingGasVolume[focus]
gasInStorage_peryear = df_country.gasInStorage[focus]
# STEP 2, notice position of arguments!
fig.add_trace(go.Scatter(x=month,
y=workingGasVolume_peryear,
name=f'workingGasVolume{yrs}',
line=dict(width=4,dash='dash')),
row=i+1, #index for the subplot, i+1 because plotly starts with 1
col=1)
fig.add_trace(go.Scatter(x=month,
y=gasInStorage_peryear,
name=f'gasInStorage{yrs}',
line = dict(width=4)),
row=i+1,
col=1)
fig.show()
但我仍然有回溯信息
Traceback (most recent call last):
File "<ipython-input-27-513826172e49>", line 43, in <module>
line=dict(width=4,dash='dash')),
TypeError: 'dict' object is not callable
要在 plotly 中使用子图,您需要:
- 使用
make_subplots
初始化布局指定row
和column
- 然后使用
row
和col
作为fig.add_trace
的参数。注意:子图的行和列从 1(不是零)开始
在您的情况下,第 2 步是您卡住的地方。最初这部分缺失(第一个 post),但现在在您的更新中它被添加为 go.Scatter
的参数。仔细查看 the examples here,因为区别只是逗号和括号及其位置。
为了澄清,这个:
fig.add_trace(go.Scatter(x=month,
y=workingGasVolume_peryear,
name=f'workingGasVolume{year}',
row=i,
col=1,
line=dict(width=4,dash='dash')))
应该是:
fig.add_trace(go.Scatter(x=month,
y=workingGasVolume_peryear,
name=f'workingGasVolume{year}',
line=dict(width=4,dash='dash')),
row=i+1,
col=1)
我在使用你的代码和数据时遇到困难,这可能是我的问题,因为我不使用这样的字典,但这里有一个工作示例,你的数据在 csv 中并使用 pandas
.还有,我把其中的某一年换成了不同的国家,这样就有了另外的情节。
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
df = pd.read_csv('someData.csv')
countries = df.country.unique()
# STEP 1
fig = make_subplots(
rows=len(countries), cols=1,
subplot_titles=(countries))
for i, country in enumerate(countries): #enumerate here to get access to i
years = df.year[df.country==country].unique()
for yrs in years:
focus = (df.country==country) & (df.year==yrs)
month = df.month[focus]
workingGasVolume_peryear = df.workingGasVolume[focus]
gasInStorage_peryear = df.gasInStorage[focus]
# STEP 2, notice position of arguments!
fig.add_trace(go.Scatter(x=month,
y=workingGasVolume_peryear,
name=f'workingGasVolume{yrs}',
line=dict(width=4,dash='dash')
),
row=i+1, #index for the subplot, i+1 because plotly starts with 1
col=1)
fig.add_trace(go.Scatter(x=month,
y=gasInStorage_peryear,
name=f'gasInStorage{yrs}',
line = dict(width=4)),
row=i+1,
col=1)
fig.show()