我正在尝试用 x 轴作为日期,y 轴作为分类变量来绘制我的数据(一个巨大的数据)。 (数据示例如下。) 我尝试如下,但图表不可读。我也想让它互动。
我只想在特定日期显示特定事件(代码)基于不同来源发生,例如创建包含线条、日期和文本的时间线
ID DATE CODE SOURCE
0 P04 2016-08-08 f m1
1 P04 2015-05-08 f m1
2 P04 2010-07-20 v m3
3 P04 2013-12-06 g m4
4 P08 2018-03-01 h m4
x2 = df.groupby(['DATE', 'CODE']).size()
x2.plot.bar()
预期输出(创建一个包含行、日期和文本的时间线,这里是代码 ) :
Plotly 是交互式图表的良好来源。准确地说出你想要什么有点困难,但这应该会给你一些想法。
import pandas as pd
import plotly.express as px
df = pd.DataFrame({'ID': ['P04', 'P04', 'P04', 'P04', 'P08'],
'DATE': ['2016-08-08 00:00:00',
'2015-05-08 00:00:00',
'2010-07-20 00:00:00',
'2013-12-06 00:00:00',
'2018-03-01 00:00:00'],
'CODE': ['f', 'f', 'v', 'g', 'h'],
'SOURCE': ['m1', 'm1', 'm3', 'm4', 'm4']})
df['DATE'] = pd.to_datetime(df['DATE'])
fig = px.scatter(df, x='DATE', y='CODE', color='SOURCE')
fig.update_traces(marker={'size': 15})
fig.show()
问题中的示例数据不会导致预期的输出。预期的输出似乎是 matplotlib 时间线,所以我会引用该数据并在 plolty 中创建一个图表。您将使用的图形对象是一个图形对象。首先,绘制 Level 数据的条形图。其次,在 y 轴的位置 0 处绘制一条水平线。第三,在散点图标记模式下添加标记。第四,您以散点图文本模式注释版本号。第五,在散点图文本模式下添加版本号。第五,在散点图文本模式下添加版本号。这么多循环处理的原因是根据值将注释位置设置为向上或向下。
import numpy as np
import pandas as pd
from datetime import datetime
import plotly.graph_objects as go
names = ['v2.2.4', 'v3.0.3', 'v3.0.2', 'v3.0.1', 'v3.0.0', 'v2.2.3',
'v2.2.2', 'v2.2.1', 'v2.2.0', 'v2.1.2', 'v2.1.1', 'v2.1.0',
'v2.0.2', 'v2.0.1', 'v2.0.0', 'v1.5.3', 'v1.5.2', 'v1.5.1',
'v1.5.0', 'v1.4.3', 'v1.4.2', 'v1.4.1', 'v1.4.0']
dates = ['2019-02-26', '2019-02-26', '2018-11-10', '2018-11-10',
'2018-09-18', '2018-08-10', '2018-03-17', '2018-03-16',
'2018-03-06', '2018-01-18', '2017-12-10', '2017-10-07',
'2017-05-10', '2017-05-02', '2017-01-17', '2016-09-09',
'2016-07-03', '2016-01-10', '2015-10-29', '2015-02-16',
'2014-10-26', '2014-10-18', '2014-08-26']
# Choose some nice levels
levels = np.tile([-5, 5, -3, 3, -1, 1],int(np.ceil(len(dates)/6)))[:len(dates)]
df = pd.DataFrame({'Name': names,'Date': dates, 'Level': levels})
df['Date'] = pd.to_datetime(df['Date'])
fig = go.Figure()
fig.add_trace(go.Bar(
x=df['Date'],
y=df['Level'],
showlegend=False,
width=0.05,
marker=dict(
color="red"
)))
fig.add_trace(go.Scatter(
x=df['Date'],
y=[0]*len(df),
showlegend=False,
line_width=2,
line_color='black'
))
fig.add_trace(go.Scatter(
x=df['Date'],
y=[0]*len(df),
mode='markers',
line_color='black',
showlegend=False,
marker=dict(
color="white",
size=8,
line=dict(
color='black',
width=2)
)))
for row in df.itertuples():
fig.add_trace(go.Scatter(
x=[row.Date],
y=[row.Level],
mode="markers+text",
marker=dict(color='red'),
showlegend=False,
text=[row.Name],
textposition='bottom center' if row.Level <=0 else 'top center',
))
fig.update_xaxes(type='category', tickvals=df.index, ticktext=[x.strftime('%Y-%m') for x in df['Date'].dt.date],tickangle=-45)
fig.update_yaxes(range=[df['Level'].min()-2, df['Level'].max()+2,], visible=False, showgrid=False, showticklabels=False)
fig.update_layout(height=400, title="Version history", template=None)
fig.show()