matplotlib 如何创建时间轴图表[已关闭]

cygmwpex  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(141)

**已关闭。**此问题正在寻求书籍、工具、软件库等的建议。它不符合Stack Overflow guidelines。目前不接受答复。

我们不允许问题寻求书籍,工具,软件库等的建议。您可以编辑问题,以便可以用事实和引用来回答。
4天前关闭。
Improve this question
有没有人知道是否可以用Python库创建这样的图?如果是这样,有没有人可以分享一些例子?

0yg35tkg

0yg35tkg1#

假设您的数据保存在spreadsheet中,为了获得更多 * 灵活性 *,您可以使用matplotlib

import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter

fig, ax = plt.subplots(figsize=(10, 3))

ax.set_ylim(0, 1)
ax.set_yticklabels([])
ax.yaxis.set_ticks_position("none")

ax.set_xticks(df[["start", "end"]].stack().unique())
ax.xaxis.set_major_formatter(DateFormatter("%H:%M"))
ax.set_xlim(df["start"].min(), df["end"].max())
for label in ax.get_xticklabels():
    label.set_weight("bold")
    label.set_fontname("serif")

d = {"Status A": "#ff0000", "Status B": "#00b050", "Status C": "#0070c0"}

for s, c in d.items():
    tmp = df[df["status"] == s]
    ax.barh(tmp["y"], tmp["duration"], left=tmp["start"], height=0.2, color=d[s])

rects = [plt.Rectangle((0, 0), 0, 0, color=c) for c in d.values()]

ax.legend(
    rects, d.keys(), ncol=len(d.keys()), bbox_to_anchor=(0.463, 1.25),
    frameon=False, handleheight=2, handlelength=3, handletextpad=0.5,
    prop={"weight": "bold", "family": "serif"},
)

plt.grid(True)
plt.tight_layout()
plt.show();

输出:

  • 使用的输入:*

| 地位|启动|结束|
| - -----|- -----|- -----|
| 状态A|十二点|十二点四十五分|
| 状态B|十二点四十五分|十三点十分|
| 状态C|十三点十分|13点40分|
| 状态B| 13点40分|十四点十五分|
| 状态A|十四点十五分|十四点四十分|
| 状态C|十四点四十分|十五点十分|
| 状态A|十五点十分|15点45分|
| 状态C| 15点45分|16点|
| 状态B| 16点|16:30|

#pip install pandas
import pandas as pd

df = pd.read_excel("file.xlsx")

df[["start", "end"]] = df[["start", "end"]].apply(pd.to_datetime, format="%H:%M") 
df["duration"] = df["end"] - df["start"]
df["y"] = 0.5 #to fake numeric y-values
jecbmhm3

jecbmhm32#

使用plotly.express.timeline应该非常简单。看看这一页的第一个例子。如果你想让它像你的截图一样在一个y轴位置,那么试试

# example directly from Plotly
import plotly.express as px
import pandas as pd

df = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-01-03'),
    dict(Task="Job B", Start='2009-01-03', Finish='2009-01-16'),
    dict(Task="Job C", Start='2009-01-16', Finish='2009-01-18')
])
# add color param and remove the y param from the example
fig = px.timeline(df, x_start="Start", x_end="Finish", color='Task')
fig.show()

相关问题