#Plotly# Python 繪圖神器
“ ?文章所涉及內(nèi)容更多來(lái)自網(wǎng)絡(luò),在此聲明,并感謝知識(shí)的貢獻(xiàn)者!”
plotly 介紹
—
有在線和離線模式,易于保存與分享plotly的繪圖結(jié)果,并且可以與Web無(wú)縫集成;

—
Ploty 官網(wǎng)
https://plotly.com/
—
ploty安裝
pip install plotly
—
ploty 教程
-繪圖模式
Plotly中繪制圖像有在線和離線兩種方式,因?yàn)樵诰€繪圖需要注冊(cè)賬號(hào)獲取API key,較為麻煩
離線繪圖又有plotly.offline.plot()和plotly.offline.iplot()兩種方法,前者是以離線的方式在當(dāng)前工作目錄下生成html格式的圖像文件,并自動(dòng)打開(kāi);后者是在jupyter notebook中專用的方法,即將生成的圖形嵌入到ipynb文件中
在jupyter notebook中使用plotly.offline.iplot()
在jupyter notebook中使用plotly.offline.iplot()時(shí),需要在之前運(yùn)行plotly.offline.init_notebook_mode()以完成繪圖代碼的初始化,否則會(huì)報(bào)錯(cuò)
在spyder或pycharm使用plotly.offline.plot()
使用plotly.offline.plot()方法會(huì)在本地新建一個(gè)HTML文件,并可以選擇是否在瀏覽器中打開(kāi)這個(gè)文件。
plotly.offline.iplot()和plotly.offline.plot()的主要參數(shù)如下:
figure_or_data:傳入plotly.graph_objs.Figure、plotly.graph_objs.Data、字典或列表構(gòu)成的,能夠描述一個(gè)graph的數(shù)據(jù)
show_link:bool型,用于調(diào)整輸出的圖像是否在右下角帶有plotly的標(biāo)記
link_text:str型輸入,用于設(shè)置圖像右下角的說(shuō)明文字內(nèi)容(當(dāng)show_link=True時(shí)),默認(rèn)為'Export to plot.ly'
image:str型或None,控制生成圖像的下載格式,有'png'、'jpeg'、'svg'、'webp',默認(rèn)為None,即不會(huì)為生成的圖像設(shè)置下載方式
filename:str型,控制保存的圖像的文件名,默認(rèn)為'plot'
image_height:int型,控制圖像高度的像素值,默認(rèn)為600
image_width:int型,控制圖像寬度的像素值,默認(rèn)為800
-繪圖流程
1添加圖軌數(shù)據(jù),使用go.Scatter、go.Bar等函數(shù)
2設(shè)置畫圖布局,使用go.Layout函數(shù)
3集成圖軌,布局?jǐn)?shù)據(jù),使用go.Figure函數(shù)
4繪制輸出,使用offline.plot和offline.iplot函數(shù)。
-常見(jiàn)圖形
plotly中的graph_objs是plotly下的子模塊,用于導(dǎo)入plotly中所有圖形對(duì)象,在導(dǎo)入相應(yīng)的圖形對(duì)象之后,便可以根據(jù)需要呈現(xiàn)的數(shù)據(jù)和自定義的圖形規(guī)格參數(shù)來(lái)定義一個(gè)graph對(duì)象,再輸入到plotly.offline.iplot()中進(jìn)行最終的呈現(xiàn).
查詢相關(guān)幫助手冊(cè)得到如下結(jié)果:
_area
_bar
_box
_candlestick
_carpet
_choropleth
_cone
_contour
_contourcarpet
_deprecations
_figure
_figurewidget
_frame
_heatmap
_heatmapgl
_histogram
_histogram2d
_histogram2dcontour
_layout
_mesh3d
_ohlc
_parcoords
_pie
_pointcloud
_sankey
_scatter
_scatter3d
_scattercarpet
_scattergeo
_scattergl
_scattermapbox
_scatterpolar
_scatterpolargl
_scatterternary
_splom
_surface
_table
_violin
area (package)
bar (package)
box (package)
candlestick (package)
carpet (package)
choropleth (package)
cone (package)
contour (package)
contourcarpet (package)
graph_objs
graph_objs_tools
heatmap (package)
heatmapgl (package)
histogram (package)
histogram2d (package)
histogram2dcontour (package)
layout (package)
mesh3d (package)
ohlc (package)
parcoords (package)
pie (package)
pointcloud (package)
sankey (package)
scatter (package)
scatter3d (package)
scattercarpet (package)
scattergeo (package)
scattergl (package)
scattermapbox (package)
scatterpolar (package)
scatterpolargl (package)
scatterternary (package)
splom (package)
surface (package)
table (package)
violin (package)
-圖形參數(shù)
在根據(jù)繪圖需求從graph_objs中導(dǎo)入相應(yīng)的obj之后,接下來(lái)需要做的事情是基于待展示的數(shù)據(jù),為指定的obj配置相關(guān)參數(shù),這在plotly中稱為構(gòu)造traces(create traces)
-圖形背景
plotly中圖像的圖層元素與底層的背景、坐標(biāo)軸等是獨(dú)立開(kāi)來(lái)的,在我們通過(guò)前面介紹的內(nèi)容,定義好繪制圖像需要的對(duì)象之后,可以直接繪制,但如果想要在背景圖層上有更多自定義化的內(nèi)容,就需要定義Layout()對(duì)象,其主要參數(shù)如下,我們根據(jù)設(shè)置對(duì)象的不同分為幾個(gè)部分并分開(kāi)舉例講解:
1文字
文字是一幅圖中十分重要的組成部分,plotly其強(qiáng)大的繪圖機(jī)制為一幅圖中的文字進(jìn)行了細(xì)致的劃分,可以非常有針對(duì)性地對(duì)某一個(gè)組件部分的字體進(jìn)行個(gè)性化的設(shè)置:
全局文字:
font:字典型,用于控制圖像中全局字體的部分,其常用鍵及功能如下:
family:str型,用于控制字體,默認(rèn)為'Open Sans',可選項(xiàng)有'verdana','arial','sans-serif'等等,具體自行移步官網(wǎng)說(shuō)明文檔
size:int型,用于控制字體大小,默認(rèn)為12
color:str型,傳入十六進(jìn)制色彩,默認(rèn)為'#444'
標(biāo)題文字:
title:str型,用于控制圖像的主標(biāo)題
titlefont:字典型,用于獨(dú)立控制標(biāo)題字體的部分,其常用鍵如下:
family:同font中的family,用于單獨(dú)控制標(biāo)題字體
size:int型,控制標(biāo)題的字體大小
color:同font中的color
2 坐標(biāo)軸
xaxis或yaxis:字典型,控制橫坐標(biāo)的各屬性,其主要鍵如下:
color:str型,傳入十六進(jìn)制色彩,控制橫坐標(biāo)上所有元素的基礎(chǔ)顏色(在未單獨(dú)指定顏色之前,這些元素均采用此處color指定的顏色)
title:str型,設(shè)置橫坐標(biāo)軸上的標(biāo)題
titlefont:字典型,同之前所有同名參數(shù)
type:str型,用于控制橫坐標(biāo)軸類型,'-'表示根據(jù)輸入數(shù)據(jù)自適應(yīng)調(diào)整,'linear'表示線性坐標(biāo)軸,'log'表示對(duì)數(shù)坐標(biāo)軸,'date'表示日期型坐標(biāo)軸,'category'表示分類型坐標(biāo)軸,默認(rèn)為'-'
autorange:bool型或'reversed',控制是否根據(jù)橫坐標(biāo)對(duì)應(yīng)的數(shù)據(jù)自動(dòng)調(diào)整坐標(biāo)軸范圍,默認(rèn)為True
range:list型,控制橫坐標(biāo)軸的區(qū)間范圍,自行設(shè)置無(wú)默認(rèn)項(xiàng),取決于橫坐標(biāo)軸的數(shù)據(jù)類型,格式均為[左端點(diǎn),右端點(diǎn)]
tickmode:str型,設(shè)置坐標(biāo)軸刻度的格式,'auto'表示自動(dòng)根據(jù)輸入的數(shù)據(jù)來(lái)決定,'linear'表示線性的數(shù)值型,'array'表示由自定義的數(shù)組來(lái)表示(用數(shù)組來(lái)自定義刻度標(biāo)簽時(shí)必須選擇此項(xiàng))
tickvals:list、numpy array或pandas中的series,作為坐標(biāo)軸刻度標(biāo)簽的替代(tickmode此時(shí)必須被設(shè)置為'array')
ticks:str型,控制刻度標(biāo)簽的書寫位置,'outside'表示在外側(cè)顯示,'inside'表示在內(nèi)側(cè)顯示,''表示不顯示
ticklen:int型,設(shè)置刻度標(biāo)簽的像素長(zhǎng)度
tickwidth:int型,設(shè)置刻度標(biāo)簽的像素寬度
tickcolor:str型,傳入十六進(jìn)制色彩,用于控制刻度標(biāo)簽的顏色
tickfont:字典型,同前面所有字典型字體控制參數(shù),用于對(duì)刻度標(biāo)簽進(jìn)行單獨(dú)控制
tickangle:int型,設(shè)置刻度標(biāo)簽的旋轉(zhuǎn)角度
showline:bool型,控制是否繪制出該坐標(biāo)軸上的直線部分
linecolor:str型,十六進(jìn)制色彩,控制坐標(biāo)軸線條的色彩
linewidth:int型,設(shè)置坐標(biāo)軸直線部分的像素寬度
showgrid:bool型,控制是否繪制網(wǎng)格線
gridcolor:str型,十六進(jìn)制色彩,控制網(wǎng)格線的顏色
gridwidth:int型,控制網(wǎng)格線的像素寬度
zeroline:bool型,控制是否在0值處繪制0刻度線
side:str型,控制x(y)軸放置于作圖區(qū)域的位置,'top'、'bottom'控制橫軸放置于頂部亦或是底部;'left'、'right'控制縱軸放置于左側(cè)亦或是右側(cè)
3 圖例
showlegend:bool型,控制是否繪制圖例
legend:字典型,用于控制用圖例相關(guān)的所有屬性的設(shè)置,主要鍵如下:
bgcolor:str型,十六進(jìn)制設(shè)置圖例背景顏色
bordercolor:設(shè)置圖例邊框的顏色
borderwidth:int型,設(shè)置圖例邊框的顏色
font:字典型,設(shè)置圖例文字部分的字體,同前面所有font設(shè)置規(guī)則
orientation:str型,設(shè)置圖例各元素的堆疊方向,'v'表示豎直,'h'表示水平堆疊
x:數(shù)值型,-2到3之間,用于設(shè)置圖例在水平方向上的位置,默認(rèn)為1.02
xanchor:str型,用于直接設(shè)置圖例水平位置的固定位置,有'left'、'center'、'right'和'auto'幾個(gè)可選項(xiàng)
y:數(shù)值型,-2到3之間,用于設(shè)置圖例在豎直方向上的位置,默認(rèn)為1
yanchor:str型,用于直接設(shè)置圖例豎直方向上的固定位置,有'top'、'middle'、'bottom'和'auto'幾個(gè)選項(xiàng)
4 其它雜項(xiàng)
width:int型,控制圖像的像素寬度,默認(rèn)為700
height:int型,控制圖像的像素高度,默認(rèn)為450
margin:字典型輸入,控制圖像邊界的寬度,其主要鍵如下:
l:int型,控制圖像距離左邊界的留白區(qū)域像素寬度,默認(rèn)為80
r:int型,控制圖像距離右邊界的留白區(qū)域像素寬度,默認(rèn)為80
t:int型,控制圖像距離上邊界的留白區(qū)域像素寬度,默認(rèn)為100
b:int型,控制圖像距離下邊界的留白區(qū)域像素寬度,默認(rèn)為80
pad:int型,控制坐標(biāo)軸與圖像區(qū)域的像素距離,默認(rèn)為0
paper_bgcolor:str型,傳入十六進(jìn)制色彩,控制圖床的顏色
plot_bgcolor:str型,傳入十六進(jìn)制色彩,控制繪圖區(qū)域的顏色
hidesources:bool型,控制是否在圖像的右下角標(biāo)記來(lái)源link
hovermode:str型或False,用于設(shè)置懸停交互的方式,有'x'、'y'、'closest'和False這幾個(gè)可選項(xiàng),F(xiàn)alse表示無(wú)懸停交互方式
hoverlabel:字典型輸入,用于控制懸停時(shí)出現(xiàn)的信息框的各屬性,主要鍵如下:
bgcolor:str型,傳入十六進(jìn)制色彩,控制信息框的背景色
bordercolor:str型,傳入十六進(jìn)制色彩,控制信息框邊框的顏色
font:字典型,控制信息框中字體的各屬性,其主要鍵如下:
family:同之前,控制字體
size:int型,控制字體大小,默認(rèn)13
color:str型,傳入十六進(jìn)制色彩,控制字體顏色
namelength:int型,控制對(duì)信息框中顯示的對(duì)應(yīng)trace的名字的長(zhǎng)度限制,建議設(shè)置為-1,即全部顯示,默認(rèn)為15,即對(duì)于長(zhǎng)于15的trace只顯示前15個(gè)字符
grid:字典型,控制一頁(yè)多圖(subplots)時(shí)的規(guī)劃多個(gè)圖的網(wǎng)格的屬性,其常用鍵如下:
rows:int型,控制網(wǎng)格中的行數(shù)(放置笛卡爾坐標(biāo)系類型的子圖),也可以設(shè)置多于實(shí)際繪圖需求的行數(shù)以達(dá)到留白的目的
roworder:str型,設(shè)置子圖按行,是從下往上疊加還是從上往下疊加,對(duì)應(yīng)'top to bottom'和'bottom to top',默認(rèn)為'top to bottm',注意,只可以設(shè)置行的疊加順序,列方向上的疊加順序始終為從左往右
columns:int型,同rows,控制網(wǎng)格的列數(shù)
pattern:str型,用于控制一頁(yè)多圖中子圖之間坐標(biāo)軸的共享情況,'coupled'表示每一列共享同一個(gè)x軸,每一行共享一個(gè)y軸,'independent'表示每個(gè)子圖xy軸獨(dú)立(這在進(jìn)行量綱相差較大的子圖的繪制尤為有用)
xgap:float型,0.0-1.0之間,用于控制子圖之間的水平空白區(qū)域?qū)挾日家粋€(gè)子圖寬度的百分比
ygap:同xgap,控制豎直方向上子圖之間的寬度
domain:字典型,設(shè)置一頁(yè)多圖時(shí),子圖占據(jù)的區(qū)域距離上下左右邊界的寬度情況,其主要鍵如下:
x:list型,格式為[x1,x2],x1控制子圖區(qū)域左端與圖床左端的距離,x2控制子圖區(qū)域右端與圖床左端的距離,x1、x2都代表百分比,在0.0-1.0之間取值
y:同x,控制子圖區(qū)域上下端分別與圖床上端的距離百分比
—
ploty 手冊(cè)
資料: https://images.plot.ly/plotly-documentation/images/python_cheat_sheet.pdf


—
ploty 案例
曲線圖
import plotly.offline as of
import plotly.graph_objs as go
of.offline.init_notebook_mode(connected=True)
trace0 = go.Scatter(
x=[1, 2, 3, 4],
y=[10, 15, 13, 17],
mode='markers'
)
trace1 = go.Scatter(
x=[1, 2, 3, 4],
y=[16, 5, 11, 9]
)
data = go.Data([trace0, trace1])
of.plot(data)
堆疊圖

import plotly
import plotly.offline as of
import plotly.graph_objs as go
trace1 = go.Bar(
x=['giraffes', 'orangutans', 'monkeys'],
y=[20, 14, 23],
name='SF Zoo'
)
trace2 = go.Bar(
x=['giraffes', 'orangutans', 'monkeys'],
y=[12, 18, 29],
name='LA Zoo'
)
data = [trace1, trace2]
layout = go.Layout(
barmode='stack'
)
fig = go.Figure(data=data, layout=layout)
of.plot(fig)
餅圖

import plotly
import plotly.offline as of
import plotly.graph_objs as go
labels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [4500,2500,1053,500]
colors = ['#FEBFB3', '#E1396C', '#96D38C', '#D0F9B1']
trace = go.Pie(labels=labels, values=values,
hoverinfo='label+percent', textinfo='value',
textfont=dict(size=20),
marker=dict(colors=colors,
line=dict(color='#000000', width=2)))
of.plot([trace])
3D 圖

import plotly
import plotly.offline as of
import plotly.graph_objs as go
import numpy as np
s = np.linspace(0, 2 * np.pi, 240)
t = np.linspace(0, np.pi, 240)
tGrid, sGrid = np.meshgrid(s, t)
r = 2 + np.sin(7 * sGrid + 5 * tGrid) # r = 2 + sin(7s+5t)
x = r * np.cos(sGrid) * np.sin(tGrid) # x = r*cos(s)*sin(t)
y = r * np.sin(sGrid) * np.sin(tGrid) # y = r*sin(s)*sin(t)
z = r * np.cos(tGrid) # z = r*cos(t)
surface = go.Surface(x=x, y=y, z=z)
data = go.Data([surface])
layout = go.Layout(
title='Parametric Plot',
scene=go.Scene(
xaxis=go.XAxis(
gridcolor='rgb(255, 255, 255)',
zerolinecolor='rgb(255, 255, 255)',
showbackground=True,
backgroundcolor='rgb(230, 230,230)'
),
yaxis=go.YAxis(
gridcolor='rgb(255, 255, 255)',
zerolinecolor='rgb(255, 255, 255)',
showbackground=True,
backgroundcolor='rgb(230, 230,230)'
),
zaxis=go.ZAxis(
gridcolor='rgb(255, 255, 255)',
zerolinecolor='rgb(255, 255, 255)',
showbackground=True,
backgroundcolor='rgb(230, 230,230)'
)
)
)
fig = go.Figure(data=data, layout=layout)
of.plot(fig)
散點(diǎn)圖

import plotly
import plotly.offline as of
import plotly.graph_objs as go
import numpy as np
N = 100
random_x = np.linspace(0, 1, N)
random_y0 = np.random.randn(N)+5
random_y1 = np.random.randn(N)
random_y2 = np.random.randn(N)-5
# Create traces
trace0 = go.Scatter(
x = random_x,
y = random_y0,
mode = 'markers',
name = 'markers'
)
trace1 = go.Scatter(
x = random_x,
y = random_y1,
mode = 'lines+markers',
name = 'lines+markers'
)
trace2 = go.Scatter(
x = random_x,
y = random_y2,
mode = 'lines',
name = 'lines'
)
data = [trace0, trace1, trace2]
of.plot(data)
區(qū)域圖
import plotly as py
import plotly.graph_objs as go
pyplt = py.offline.plot
import numpy as np
#隨機(jī)生成100個(gè)交易日的收益率
s1=np.random.RandomState(8)#生成局部種子
s2=np.random.RandomState(9)#生成局部種子
rd1=s1.rand(100)/10-0.02 #挑選100個(gè)數(shù)
rd2=s2.rand(100)/10-0.02
#設(shè)定初始資金
initial1=100000
initial2=100000
total1=[]
total2=[]
for i in range(len(rd1)):
initial1 = initial1*rd1[i] + initial1
initial2 = initial2*rd2[i] + initial2
total1.append(initial1)
total2.append(initial2)
trace1=go.Scatter(
y=total1,fill='none',?? #填充到下一條曲線
mode='lines',#無(wú)邊界線
name="策略1"
)
trace2=go.Scatter(
y=total2,fill='tonexty', #填充到y(tǒng)=0
mode='lines',#無(wú)邊界線
name="策略2"
)
data=[trace1,trace2]
layout=dict(title='策略凈值線',xaxis=dict(title='交易天數(shù)'),yaxis=dict(title='凈值'))
fig=dict(data=data,layout=layout)
pyplt(fig,filename='交叉處填充面積圖.html')
—
其他問(wèn)題:
Spyder 啟動(dòng)閃退
在Prompt中輸入spyder return 或者spyder --new-instance,會(huì)出現(xiàn)報(bào)錯(cuò)信息,根據(jù)報(bào)錯(cuò)信息檢索
https://blog.csdn.net/weixin_42215298/article/details/130408436
使用清華鏡像安裝
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package
https://blog.csdn.net/myyggsddu/article/details/128199778
—
參考資料:
https://blog.csdn.net/weixin_45638146/article/details/115294728
https://www.jianshu.com/p/84b54e13a7d8
https://blog.csdn.net/m0_59485658/article/details/129051020
https://blog.csdn.net/m0_72557783/article/details/126548209
https://zhuanlan.zhihu.com/p/144005902
https://blog.csdn.net/weixin_43794311/article/details/105326655
https://www.freesion.com/article/4823543536/
