【plotly】基本图表

是什么

  1. plotly 是一个基于 HTML 的可视化工具,它支持 Python、R、Javascript 等语言
  2. Dash 深度依赖 Plotly,可实现动态交互
pip install plotly

折线图和散点图

import plotly.graph_objs as go
import plotly
import numpy as np

# 画线
trace1 = go.Scatter(
    x=np.arange(15),
    y=[np.sin(i) if i % 5 else None for i in np.arange(15)],
    name='Gaps',
)

# 画线,要求对于缺失值,断开
trace2 = go.Scatter(
    x=np.arange(15),
    y=[np.cos(i) if i % 5 else None for i in np.arange(15)],
    name='<b>No</b> Gaps',  # 可以使用html风格
    connectgaps=True  # 对于缺失值,是否跳过去,默认为False
)

# 画散点图,并配置每个点上的 text
trace3 = go.Scatter(
    x=np.arange(15),
    y=np.sin(0.666 * np.arange(15)),
    text=[str(i) + '_text' for i in np.arange(15)],  # 可以显示每个点对应的文字
    textposition='top center',
    mode='markers+text',  # markers 代表散点,text代表显示text
    name='scatter'
)

# 画散点图,并配置每个点的大小、颜色
trace4 = go.Scatter(
    x=np.arange(15),
    y=np.cos(0.666 * np.arange(15)),
    text=[str(i) + '_text' for i in np.arange(15)],  # 可以显示每个点对应的文字
    textposition='top center',
    marker={'color': ['red', 'blue', 'green'] * 5, 'size': [20, 50, 100] * 5},
    mode='markers',
    name='scatter2'
)

# layout:配置图表(也可以省略)
layout = go.Layout(title="all plots", xaxis={'title': 'x'}, yaxis={'title': 'value'})

# fig = go.Figure(data=[trace1, trace2, trace3], layout=layout)
fig = go.Figure(data=[trace1, trace2, trace3, trace4])
plotly.offline.plot(fig, filename='example.html')

知识点:

  1. connectgaps=True 折线图的 gap 是中断还是连续
  2. name可以做 html 标记
  3. mode='markers+text' 调整折线还是散点,是否标记 text
  4. marker 传入一个 dict,可以对点的大小、颜色进行调整

关于画在哪:

  • plotly.offline.plot 会生成一个离线的html文件,然后自动打开
  • plotly.offline.iplot 可以在jupyter内直接生成图表
  • fig.show() 则会像 matplotlib 一样画在弹窗上

Bar

import plotly.graph_objs as go
import plotly

# 原始数据
dataset = {'x': ['Windows', 'Linux', 'Unix', 'MacOS'],
           'y1': [45, 26, 37, 13],
           'y2': [19, 27, 33, 21]}

# 拆成画图所需数据格式
data1 = go.Bar(
    x=dataset['x'],
    y=dataset['y1'],
    name='v1'
)
data2 = go.Bar(
    x=dataset['x'],
    y=dataset['y2'],
    name='v2'
)

layout = go.Layout(title="bar charts", xaxis={'title': 'x'}, yaxis={'title': 'value'})
fig = go.Figure(data=[data1, data2], layout=layout)
plotly.offline.plot(fig, filename='example.html')

  • 同样可以使用marker={'color':['red','blue']} 来配置颜色

填充区域

饼图

import plotly.graph_objs as go
import plotly

dataset = {'labels': ['Windows', 'Linux', 'Unix', 'MacOS', 'Android', 'iOS'],
           'values': [280, 25, 10, 100, 250, 270]}

data1 = go.Pie(
    labels=dataset['labels'],
    values=dataset['values']
)

layout = go.Layout(title="pie charts")
fig = go.Figure(data=[data1], layout=layout)
plotly.offline.plot(fig, filename='example.html')

Heatmap

trace=go.Heatmap(
    z=[
        [1,2,3,4],
        [5,6,7,8]
    ]
)
plotly.offline.plot([trace])

区域块

trace=go.Scatter(
    x=[1,2,6],
    y=[1,2,0.5],
    fill="tonexty",
    fillcolor="#FF0"
)
plotly.offline.plot([trace])

Histogram

import scipy.stats as stats

trace=go.Histogram(
    x=stats.norm().rvs(100),
    marker=dict(
        color=["red","blue","green"]*30
    )
)
plotly.offline.plot([trace])

Histogram2d

trace=go.Histogram2d(
    x=[1,2,3,3,3,4,5],
    y=[1,2,3,3,3,4,5]
)
plotly.offline.plot([trace])

地图

全球地图

trace = go.Scattergeo(
    lon=[100, 400],
    lat=[0, 0],
    marker=dict(
        color=['red', 'blue'],
        size=[30, 50]
    ),
    mode="markers"
)
plotly.offline.plot([trace])

区域地图

trace=go.Choropleth(
    locations=['AZ','CA','VT'],
    locationmode='USA-states',
    colorscale='Picnic',
    z=[10,20,40]
)
layout=dict(geo=dict(scope='usa'))
fig=go.Figure(data=[trace], layout=layout)
plotly.offline.plot(fig)

3D 图

3D Surface 图

trace = go.Surface(
    colorscale='Viridis',
    z=[
        [3, 5, 8, 13],
        [21, 13, 8, 5]
    ]
)
plotly.offline.plot([trace])

3D scatter 图

trace = go.Scatter3d(
    x=[9, 8, 5, 1],
    y=[1, 2, 4, 8],
    z=[11, 8, 15, 3],
    mode="lines"
)
plotly.offline.plot([trace])

  • mode 可以是’lines’,’markers’,对应三维线、点

Boxplot

trace = go.Box(
    x=[1, 2, 3, 3, 3, 4, 5]
)
plotly.offline.plot([trace])

基本配置

配置坐标轴

import plotly.graph_objs as go
import plotly

trace = go.Scatter(
    x=[-1, 2, 3, 4],
    y=[-1, 2, 3, 6]
)
axis_template = dict(
    showgrid=True,  # 网格
    zeroline=True,  # 是否显示基线,即沿着(0,0)画出x轴和y轴
    nticks=50,  # 显示多少个网格
    showline=True,  # 显示图表的外窗格线
    title='X axis',
    mirror='all',
    zerolinecolor="#FF0000"
)
layout = go.Layout(xaxis=axis_template, yaxis=axis_template)

fig = go.Figure(data=[trace], layout=layout)
plotly.offline.plot(fig)

多图表

同一个图表多轴

示例:https://plot.ly/python/multiple-axes/

双y轴

import plotly.graph_objects as go
from plotly.subplots import make_subplots

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# Add traces
fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name="yaxis data"),
    secondary_y=False,
)

fig.add_trace(
    go.Scatter(x=[2, 3, 4], y=[4, 5, 6], name="yaxis2 data"),
    secondary_y=True,
)

# Add figure title
fig.update_layout(
    title_text="Double Y Axis Example"
)

# Set x-axis title
fig.update_xaxes(title_text="xaxis title")

# Set y-axes titles
fig.update_yaxes(title_text="<b>primary</b> yaxis title", secondary_y=False)
fig.update_yaxes(title_text="<b>secondary</b> yaxis title", secondary_y=True)

fig.show()

你甚至可以用yaxis2, yaxis3, yaxis4 画4个y轴

多个图表

https://plot.ly/python/subplots/

from plotly.subplots import make_subplots
import plotly.graph_objects as go

fig = make_subplots(rows=3, cols=1)

fig.append_trace(go.Scatter(
    x=[3, 4, 5],
    y=[1000, 1100, 1200],
), row=1, col=1)

fig.append_trace(go.Scatter(
    x=[2, 3, 4],
    y=[100, 110, 120],
), row=2, col=1)

fig.append_trace(go.Scatter(
    x=[0, 1, 2],
    y=[10, 11, 12]
), row=3, col=1)


fig.update_layout(height=600, width=600, title_text="Stacked Subplots")
fig.show()

参考文献

https://plot.ly/python/
https://blog.csdn.net/fox64194167/article/details/80458711
https://blog.csdn.net/u012897374/article/details/77857980



您的支持将鼓励我继续创作!