首页 > 解决方案 > 跨多个组/列绘图

问题描述

我正在提取一个数据集,其格式如下。我有两个变量(sampleidNum),并希望在两组中进行绘图。我附上了我希望输出看起来像在 JMP 中生成的内容。我已经尝试过在情节中旋转和子情节,但看起来你不能传递groupby到子情节中。

任何建议都会很棒。

# -*- coding: utf-8 -*-

from plotly import tools
from plotly.offline import  plot
import plotly.graph_objs as go
import pandas as pd
import numpy as np

d  = {'day':['Mon','Mon','Mon','Mon','Tues','Tues','Tues','Tues'],
      'sample':['A','A','B','B','A','A','B','B'],
      'idNum':[1,2,1,2,1,2,1,2],
      'values':[1.3,1.4,1.25,1,1.87,1.11,1.9,0.8]}

df = pd.DataFrame(data=d)

pdata = [dict(type = 'scatter',
              x = df.day,
              y = df.values,
              mode = 'markers',
              transforms = [dict(type = 'groupby',
                                 groups =df.idNum)])]

plot({'data': pdata}, validate=False)

期望的输出

标签: pythonpython-3.xpandasplotly

解决方案


这就像没有groupby. 但是您可能会从中找到一些有用的东西。代码:

# import all the necessaries libraries
from plotly import tools
import plotly.offline as py
import plotly.graph_objs as go
import pandas as pd
# your data
d  = {'day':['Mon','Mon','Mon','Mon','Tues','Tues','Tues','Tues'],
      'sample':['A','A','B','B','A','A','B','B'],
      'idNum':[1,2,1,2,1,2,1,2],
      'values':[1.3,1.4,1.25,1.0,1.87,1.11,1.9,0.8]}
# create a df
df = pd.DataFrame(data=d)
# create traces
trace1 = go.Scatter(
    x=df.loc[(df['sample']=='A') & (df['idNum']==1)]['day'],
    y=df.loc[(df['sample']=='A') & (df['idNum']==1)]['values'],
    line = dict(color=('blue')),
    legendgroup='first',
    name='1'
)
trace2 = go.Scatter(
    x=df.loc[(df['sample']=='A') & (df['idNum']==2)]['day'],
    y=df.loc[(df['sample']=='A') & (df['idNum']==2)]['values'],
    line = dict(color=('red')),
    legendgroup='second',
    name='B1',
    showlegend=False
)
trace3 = go.Scatter(
    x=df.loc[(df['sample']=='B') & (df['idNum']==1)]['day'],
    y=df.loc[(df['sample']=='B') & (df['idNum']==1)]['values'],
    line = dict(color=('blue')),
    legendgroup='first',
    name='A2',
    showlegend=False
)
trace4 = go.Scatter(
    x=df.loc[(df['sample']=='B') & (df['idNum']==2)]['day'],
    y=df.loc[(df['sample']=='B') & (df['idNum']==2)]['values'],
    line = dict(color=('red')),
    legendgroup='second',
    name='2'
)
# told plotly, how much subplots we want
fig = tools.make_subplots(rows=2, cols=1)
# add to each subplot trace
fig.append_trace(trace1, 1, 1)
fig.append_trace(trace2, 1, 1)
fig.append_trace(trace3, 2, 1)
fig.append_trace(trace4, 2, 1)
# customize layout
fig['layout']['yaxis1'].update(title='values',
   tickvals=[0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0], range=[0.6,2.0],
   showgrid=False,showline=True,zeroline=True)
fig['layout']['xaxis1'].update(title='days',
   showgrid=False,showline=True,zeroline=True)
fig['layout']['yaxis2'].update(title='values',
   tickvals=[0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0], range=[0.6,2.0],
   showgrid=False,showline=True,zeroline=True)
fig['layout']['xaxis2'].update(title='days',
   showgrid=False,showline=True,zeroline=True)
# set height and width for a plot
fig['layout'].update(height=600, width=400, title='<b>values vs. day</b>')
# plot a plot
py.plot(fig, filename='stacked-subplots')

输出:

像你想要的东西

我不能只创建两条迹线,因为您在每个图中都有相似的数据。有关如何在 plotly 中创建子图的更多信息,您可以在此处查看。希望对你有帮助


推荐阅读