问题描述
我很想知道是否有等价于:
import pandas as pd
import numpy as np
data = pd.DataFrame({'Day':range(10),'Temperature': np.random.rand(10),'Wind': np.random.rand(10),'Humidity': np.random.rand(10),'Pressure': np.random.rand(10)})
data.set_index('Day').plot(subplots=True,layout=(2,2),figsize=(10,5))
plt.tight_layout()
生成 Plotly 图而不是 matplotlib 图表。
解决方法
- 根据文档,Plotly Express does not support arbitrary subplot capabilities 支持 faceting by a given data dimension,也支持 marginal charts to display distribution information。
- 这演示了低级
plotly.subplots
模块及其公开的make_subplots
函数的用法,以构造具有任意子图的图形。
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# using your sample data
fig = make_subplots(rows=2,cols=2,start_cell="bottom-left")
fig.add_trace(go.Scatter(x=data.index,y=data.Temperature,name='Temp'),row=1,col=1,)
fig.add_trace(go.Scatter(x=data.index,y=data.Wind,name='Wind'),col=2)
fig.add_trace(go.Scatter(x=data.index,y=data.Humidity,name='Humidity'),row=2,col=1)
fig.add_trace(go.Scatter(x=data.index,y=data.Pressure,name='Pressure'),col=2)
fig.show()
,
对于一个情节快速的解决方案:
您可以使用 pd.melt()
在同一列中获取所有变量:
import pandas as pd
import plotly.express as px
df = pd.DataFrame({
'Day':range(10),'Temperature': np.random.rand(10),'Wind': np.random.rand(10),'Humidity': np.random.rand(10),'Pressure': np.random.rand(10),})
df_melt = df.melt(
id_vars='Day',value_vars=['Temperature','Wind','Humidity','Pressure'])
您的数据框现在看起来像这样,名为“variable”的列中的变量名称和名为“value”的列中的值:
Day variable value
0 0 Temperature 0.609
1 1 Temperature 0.410
2 2 Temperature 0.194
3 3 Temperature 0.663
4 4 Temperature 0.351
现在您可以使用带有参数 px.scatter()
的 facet_col
来获取多个图:
fig = px.scatter(
df_melt,x='Day',y='value',facet_col='variable',facet_col_wrap=2,color='variable',width=800,)
现在在您的示例中,所有变量都具有相同的值范围。但如果情况并非如此,那么您可能需要确保每个图在 y 轴上都有自己的范围。这可以按如下方式完成:
fig.update_yaxes(showticklabels=True,matches=None)
可以在此处找到有关刻面图的更多信息:
https://plotly.com/python/facet-plots/