无法在单个图形中绘制多条线
Unable to plot multiple lines in a single graph
我遇到了一个奇怪的问题,我试图在一张图中绘制多条线,但它只是一条线。我正在分享屏幕截图,因为您可以看到两者的接近值不同。它没有渲染 binance 图表,因为它似乎被覆盖了。
图表
更新
代码如下
# All Imports
import ccxt
import pandas as pd
import matplotlib.pyplot as plt
# Connect binance
binance = ccxt.binance()
ftx = ccxt.ftx()
binance_btc_usdt_ohlcv = binance.fetch_ohlcv('BTC/USDT','1d',limit=100)
ftx_btc_usdt_ohlcv = ftx.fetch_ohlcv('BTC/USDT','1d',limit=100)
df_binance = pd.DataFrame(binance_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
df_ftx = pd.DataFrame(ftx_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
fig, ax = plt.subplots()
ax.plot(df_binance['ts'], df_binance['v'],label='Binance')
ax.plot(df_ftx['ts'], df_ftx['v'],label='FTX')
plt.legend()
# ax.tick_params(axis='x', colors='red')
plt.show()
- 测试于
python 3.8.12
、pandas 1.3.3
、matplotlib 3.4.3
现有代码
- 工作没有任何问题,但是,
'Binance'
比 'FTX'
小,可以用 ax.set_yscale('log')
解决
df_binance = pd.DataFrame(binance_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
df_ftx = pd.DataFrame(ftx_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
fig, ax = plt.subplots()
ax.plot(df_binance['ts'], df_binance['v'], label='Binance')
ax.plot(df_ftx['ts'], df_ftx['v'], label='FTX')
ax.legend()
ax.set_yscale('log') # resolve issues of scale with the y-axis values
plt.show()
- 没有
ax.set_yscale('log')
,'Binance'
仍然出现在地块上
- OP 中的文本代码示例使用了
'v'
,但问题出现在 'c'
(在屏幕截图中)。
- 问题是
df_ftx.c
和df_binance.c
几乎一模一样,用alpha=0.5
就可以看出来。
# plot dataframe
ax = df_binance.plot(x='ts', y='c', label='Binance', figsize=(8, 6), logy=True)
p2 = df_ftx.plot(x='ts', y='c', label='FTX', ax=ax, alpha=0.5)
ax.legend(bbox_to_anchor=(1, 1.02), loc='upper left')
plt.show()
- 给定 y 轴的比例,差异太小,无法区分两条线。
>>> df_binance.c.sub(df_ftx.c)
0 1.00
1 -2.13
2 0.07
3 -2.44
4 -0.35
5 1.35
6 11.51
7 -6.17
8 -11.91
9 -2.86
10 -13.98
11 -7.40
12 -3.13
13 1.56
14 -15.52
15 -8.63
16 0.83
17 10.44
18 0.82
19 -0.95
20 -12.82
21 -2.54
22 -15.13
23 -14.46
24 -4.63
25 -12.60
26 -10.01
27 -17.00
28 -4.00
29 -16.00
30 -9.49
31 -5.18
32 -3.71
33 23.95
34 -4.71
35 -2.38
36 -11.53
37 -7.13
38 -10.78
39 1.85
40 0.01
41 -9.68
42 7.87
43 9.90
44 -4.65
45 2.83
46 5.91
47 -3.11
48 -14.48
49 -11.36
50 -0.86
51 2.64
52 -22.12
53 -8.10
54 -6.27
55 -3.69
56 -0.86
57 1.91
58 5.69
59 1.24
60 -1.27
61 -12.48
62 -1.59
63 -8.18
64 5.98
65 -6.26
66 -4.25
67 -2.38
68 11.38
69 -9.39
70 -4.74
71 -0.43
72 -9.36
73 -3.10
74 -0.65
75 1.54
76 -2.72
77 -1.90
78 -0.39
79 -9.10
80 -4.99
81 -6.06
82 6.99
83 0.00
84 -8.78
85 2.43
86 -2.28
87 -10.00
88 -9.65
89 -5.07
90 -1.00
91 -0.06
92 -28.58
93 -8.43
94 -8.67
95 -17.16
96 -3.41
97 -12.59
98 -1.85
99 5.99
Name: c, dtype: float64
更新代码
- 使用
pd.to_datetime
将'ts'
转换为datetime dtype
- 直接使用
pandas.DataFrame.plot
绘图,因为数据在数据框中
- 此示例绘制到
secondary_y
,否则使用参数 logy=True
。
df_binance = pd.DataFrame(binance_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
df_binance.ts = pd.to_datetime(df_binance.ts, unit='ms') # convert column to a datetime dtype
df_ftx = pd.DataFrame(ftx_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
df_ftx.ts = pd.to_datetime(df_ftx.ts, unit='ms') # convert column to a datetime dtype
# plot dataframe
ax = df_binance.plot(x='ts', y='v', label='Binance', figsize=(8, 6))
p2 = df_ftx.plot(x='ts', y='v', label='FTX', ax=ax, secondary_y=True)
ax.legend(loc='upper left')
p2.legend(loc='upper right')
plt.show()
- 使用
logy=True
代替 secondary_y=True
# plot dataframe
ax = df_binance.plot(x='ts', y='v', label='Binance', figsize=(8, 6), logy=True)
p2 = df_ftx.plot(x='ts', y='v', label='FTX', ax=ax)
ax.legend(bbox_to_anchor=(1, 1.02), loc='upper left')
plt.show()
我遇到了一个奇怪的问题,我试图在一张图中绘制多条线,但它只是一条线。我正在分享屏幕截图,因为您可以看到两者的接近值不同。它没有渲染 binance 图表,因为它似乎被覆盖了。
图表
更新
代码如下
# All Imports
import ccxt
import pandas as pd
import matplotlib.pyplot as plt
# Connect binance
binance = ccxt.binance()
ftx = ccxt.ftx()
binance_btc_usdt_ohlcv = binance.fetch_ohlcv('BTC/USDT','1d',limit=100)
ftx_btc_usdt_ohlcv = ftx.fetch_ohlcv('BTC/USDT','1d',limit=100)
df_binance = pd.DataFrame(binance_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
df_ftx = pd.DataFrame(ftx_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
fig, ax = plt.subplots()
ax.plot(df_binance['ts'], df_binance['v'],label='Binance')
ax.plot(df_ftx['ts'], df_ftx['v'],label='FTX')
plt.legend()
# ax.tick_params(axis='x', colors='red')
plt.show()
- 测试于
python 3.8.12
、pandas 1.3.3
、matplotlib 3.4.3
现有代码
- 工作没有任何问题,但是,
'Binance'
比'FTX'
小,可以用ax.set_yscale('log')
解决
df_binance = pd.DataFrame(binance_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
df_ftx = pd.DataFrame(ftx_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
fig, ax = plt.subplots()
ax.plot(df_binance['ts'], df_binance['v'], label='Binance')
ax.plot(df_ftx['ts'], df_ftx['v'], label='FTX')
ax.legend()
ax.set_yscale('log') # resolve issues of scale with the y-axis values
plt.show()
- 没有
ax.set_yscale('log')
,'Binance'
仍然出现在地块上
- OP 中的文本代码示例使用了
'v'
,但问题出现在'c'
(在屏幕截图中)。- 问题是
df_ftx.c
和df_binance.c
几乎一模一样,用alpha=0.5
就可以看出来。
- 问题是
# plot dataframe
ax = df_binance.plot(x='ts', y='c', label='Binance', figsize=(8, 6), logy=True)
p2 = df_ftx.plot(x='ts', y='c', label='FTX', ax=ax, alpha=0.5)
ax.legend(bbox_to_anchor=(1, 1.02), loc='upper left')
plt.show()
- 给定 y 轴的比例,差异太小,无法区分两条线。
>>> df_binance.c.sub(df_ftx.c)
0 1.00
1 -2.13
2 0.07
3 -2.44
4 -0.35
5 1.35
6 11.51
7 -6.17
8 -11.91
9 -2.86
10 -13.98
11 -7.40
12 -3.13
13 1.56
14 -15.52
15 -8.63
16 0.83
17 10.44
18 0.82
19 -0.95
20 -12.82
21 -2.54
22 -15.13
23 -14.46
24 -4.63
25 -12.60
26 -10.01
27 -17.00
28 -4.00
29 -16.00
30 -9.49
31 -5.18
32 -3.71
33 23.95
34 -4.71
35 -2.38
36 -11.53
37 -7.13
38 -10.78
39 1.85
40 0.01
41 -9.68
42 7.87
43 9.90
44 -4.65
45 2.83
46 5.91
47 -3.11
48 -14.48
49 -11.36
50 -0.86
51 2.64
52 -22.12
53 -8.10
54 -6.27
55 -3.69
56 -0.86
57 1.91
58 5.69
59 1.24
60 -1.27
61 -12.48
62 -1.59
63 -8.18
64 5.98
65 -6.26
66 -4.25
67 -2.38
68 11.38
69 -9.39
70 -4.74
71 -0.43
72 -9.36
73 -3.10
74 -0.65
75 1.54
76 -2.72
77 -1.90
78 -0.39
79 -9.10
80 -4.99
81 -6.06
82 6.99
83 0.00
84 -8.78
85 2.43
86 -2.28
87 -10.00
88 -9.65
89 -5.07
90 -1.00
91 -0.06
92 -28.58
93 -8.43
94 -8.67
95 -17.16
96 -3.41
97 -12.59
98 -1.85
99 5.99
Name: c, dtype: float64
更新代码
- 使用
pd.to_datetime
将 - 直接使用
pandas.DataFrame.plot
绘图,因为数据在数据框中- 此示例绘制到
secondary_y
,否则使用参数logy=True
。
- 此示例绘制到
'ts'
转换为datetime dtype
df_binance = pd.DataFrame(binance_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
df_binance.ts = pd.to_datetime(df_binance.ts, unit='ms') # convert column to a datetime dtype
df_ftx = pd.DataFrame(ftx_btc_usdt_ohlcv, columns=['ts', 'o', 'h', 'l', 'c', 'v'])
df_ftx.ts = pd.to_datetime(df_ftx.ts, unit='ms') # convert column to a datetime dtype
# plot dataframe
ax = df_binance.plot(x='ts', y='v', label='Binance', figsize=(8, 6))
p2 = df_ftx.plot(x='ts', y='v', label='FTX', ax=ax, secondary_y=True)
ax.legend(loc='upper left')
p2.legend(loc='upper right')
plt.show()
- 使用
logy=True
代替secondary_y=True
# plot dataframe
ax = df_binance.plot(x='ts', y='v', label='Binance', figsize=(8, 6), logy=True)
p2 = df_ftx.plot(x='ts', y='v', label='FTX', ax=ax)
ax.legend(bbox_to_anchor=(1, 1.02), loc='upper left')
plt.show()