2 回答

TA貢獻1848條經驗 獲得超6個贊
除了您對情節的積極評論之外,這里是一個如何為數據集實現多軸的示例。
該代碼比看起來簡單得多。由于我格式化dict
s 以便于閱讀的方式,代碼顯得“冗長”。
關鍵要素是:
time
添加列 ( )的累積和time_c
以供使用xaxis2
。添加與 對齊的隱藏跟蹤
xaxis
,以及與 對齊的時間數據xaxis2
。如果沒有隱藏跡線,則兩個軸要么不出現,要么出現但未對齊,因為只繪制了一條跡線。
(更新)示例代碼:
以下代碼已更新,以解決 OP 在使用更大(70k 行)數據集時遇到的問題。
layout['xaxis']
鍵的更改是對和字典的更新,layout['xaxis2']
以包含'type': 'category'
,'nticks'
和 定義的'range'
鍵。
import pandas as pd
from plotly.offline import plot
# Create the dataset.
raw_data = {'time': [21.9235, 4.17876, 4.02168, 3.81504, 4.2972],
'tpu': [33.3, 33.3, 33.3, 33.3, 33.3],
'cpu': [32, 32, 32, 32, 32],
'memused': [435.92, 435.90, 436.02, 436.02, 436.19]}
df = pd.DataFrame(raw_data)
df['time_c'] = df['time'].cumsum().round(2)
# Plotting code.
data = []
layout = {'margin': {'t': 105},
'title': {'text': 'Example Showing use of Secondary X-Axis',
'y': 0.97}}
# Create a (hidden) trace for the xaxis.
data.append({'x': df.index,
'y': df['memused'],
'showlegend': False,
'mode': 'markers',
'marker': {'size': 0.001}})
# Create the visible trace for xaxis2.
data.append({'x': df['time_c'],
'y': df['memused'],
'xaxis': 'x2',
'name': 'Inference'})
# Configure graph layout.
nticks = int(df.shape[0] // (df.shape[0] * 0.05))
layout['xaxis'] = {'title': 'Number of Inferences',
'nticks': nticks,
'range': [df.index.min(), df.index.max()],
'tickangle': 45,
'type': 'category'}
layout['xaxis2'] = {'title': 'Time(ms)',
'nticks': nticks,
'overlaying': 'x1',
'range': [df['time_c'].min(), df['time_c'].max()],
'side': 'top',
'tickangle': 45,
'type': 'category'}
layout['yaxis'] = {'title': 'Memory Used (MB)'}
fig = {'data': data, 'layout': layout}
plot(fig, filename='/path/to/graph.html')
示例圖(原始數據集):
為了代碼簡單起見,我故意省略了任何額外的顯示配置。然而,參考頂級的plotly 文檔,這些圖表是高度可配置的。
示例圖(新數據集):
該圖使用來自其他答案的(更大,70k 行)合成數據集。

TA貢獻1909條經驗 獲得超7個贊
盡管通常不鼓勵,但我將發布另一個答案來解決新數據集,因為前面的答案在給定原始數據集的情況下有效。
此示例與輔助 x 軸的原始請求不同,原因有兩個:
由于(新)數據集的大小,繪制“隱藏”數據層并不是最佳選擇。
為了使輔助 x 軸正確顯示,必須繪制第二個趨勢,并且考慮到之前的原因,這不再是一個選項。
因此,采取了不同的方法——x軸的組合標記。單個 x 軸沒有繪制兩個軸,而是具有兩個所需的標簽。
示例圖:
注意:這(顯然)是合成數據,以便達到更新問題中的行數 (70k)。
示例代碼:
import numpy as np
import pandas as pd
from plotly.offline import plot
# Synthesised dataset. (This code can be ignored.)
np.random.seed(0)
a = np.random.exponential(size=70000)*4
t = pd.Series(a).rolling(window=2000, min_periods=50).mean().to_numpy()
r = np.arange(70000).astype(str)
m = t*100
df = pd.DataFrame({'run': r,
'time': t,
'memused': m}).dropna()
# Add cumulative time column.
df['time_c'] = df['time'].cumsum().round(1)
# --- Graphing code starts here ---
def create_labels(x):
"""Function to create xaxis labels."""
return f"({x['run']}): {x['time_c']}"
# Create xaxis labels.
df['xaxis'] = df.apply(create_labels, axis=1)
# Create the graph.
data = []
layout = {'title': 'Combined X-Axis Labeling'}
data.append({'x': df['xaxis'],
'y': df['memused']})
layout['xaxis'] = {'title': '(Inference): Cumulative Time (ms)',
'type': 'category',
'nticks': df.shape[0] // 3500,
'tickangle': 45}
layout['yaxis'] = {'title': 'Memory Used (MB)'}
fig = {'data': data, 'layout': layout}
plot(fig, filename='/path/to/graph.html')
添加回答
舉報