Python脚本数据交互可视化Plotly如何用

wen 实用脚本 3

本文目录导读:

Python脚本数据交互可视化Plotly如何用

  1. 安装Plotly
  2. 基本图表类型
  3. 高级交互功能
  4. 3D可视化
  5. 地图可视化
  6. 交互功能定制
  7. 导出图表
  8. 在Jupyter Notebook中显示
  9. 实战示例:股票价格可视化
  10. 性能优化建议

我来详细介绍Python中使用Plotly进行数据交互可视化的方法。

安装Plotly

pip install plotly

基本图表类型

散点图 (Scatter Plot)

import plotly.express as px
import pandas as pd
import numpy as np
# 示例数据
df = pd.DataFrame({
    'x': np.random.randn(100),
    'y': np.random.randn(100),
    'category': np.random.choice(['A', 'B', 'C'], 100)
})
# 基本散点图
fig = px.scatter(df, x='x', y='y', color='category',
                 title='交互式散点图',
                 hover_data=['category'])  # 悬停显示数据
fig.show()

折线图

# 时间序列数据
dates = pd.date_range('2023-01-01', periods=100)
values = np.random.randn(100).cumsum()
df_line = pd.DataFrame({'date': dates, 'value': values})
fig = px.line(df_line, x='date', y='value', 
              title='交互式折线图',
              markers=True)  # 显示数据点
fig.show()

柱状图

# 分组柱状图
df_bar = pd.DataFrame({
    'Month': ['Jan', 'Feb', 'Mar', 'Apr'],
    'Product A': [23, 45, 56, 78],
    'Product B': [34, 56, 67, 89]
})
fig = px.bar(df_bar, x='Month', y=['Product A', 'Product B'],
             title='分组柱状图',
             barmode='group')
fig.show()

高级交互功能

1 添加滑块和按钮

import plotly.graph_objects as go
# 创建包含滑块的图表
fig = go.Figure()
# 添加数据
x = np.linspace(0, 10, 100)
for i, freq in enumerate([1, 2, 3]):
    fig.add_trace(go.Scatter(
        x=x, 
        y=np.sin(freq * x),
        name=f'频率 {freq}Hz',
        visible=(i == 0)  # 默认显示第一个
    ))
# 添加滑块
fig.update_layout('带滑块的交互图表',
    sliders=[{
        'active': 0,
        'currentvalue': {'prefix': '频率: '},
        'steps': [
            {'label': f'{freq}Hz', 'method': 'update', 
             'args': [{'visible': [i == j for j in range(3)]}]}
            for i, freq in enumerate([1, 2, 3])
        ]
    }]
)
fig.show()

2 下拉菜单

fig = go.Figure()
# 准备数据
x = np.linspace(0, 10, 100)
traces = [
    go.Scatter(x=x, y=np.sin(x), name='正弦', visible=True),
    go.Scatter(x=x, y=np.cos(x), name='余弦', visible=False),
    go.Scatter(x=x, y=np.tan(x), name='正切', visible=False)
]
for trace in traces:
    fig.add_trace(trace)
# 添加下拉菜单
fig.update_layout(
    updatemenus=[{
        'buttons': [
            {'label': '正弦', 'method': 'update', 
             'args': [{'visible': [True, False, False]}]},
            {'label': '余弦', 'method': 'update', 
             'args': [{'visible': [False, True, False]}]},
            {'label': '正切', 'method': 'update', 
             'args': [{'visible': [False, False, True]}]}
        ],
        'direction': 'down',
        'showactive': True,
        'x': 0.1,
        'y': 1.15
    }]
)
fig.show()

3D可视化

# 3D散点图
fig = px.scatter_3d(df, x='x', y='y', z=np.random.randn(100),
                    color='category',
                    title='3D散点图',
                    opacity=0.7)
fig.show()
# 3D曲面图
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
fig = go.Figure(data=[go.Surface(z=Z, x=x, y=y)])
fig.update_layout(title='3D曲面图', scene=dict(
    xaxis_title='X轴',
    yaxis_title='Y轴',
    zaxis_title='Z轴'))
fig.show()

地图可视化

# 世界地图
df_map = px.data.gapminder().query("year==2007")
fig = px.scatter_geo(df_map, locations="iso_alpha",
                     size="pop",
                     color="continent",
                     hover_name="country",
                     projection="natural earth",
                     title="世界各国人口分布")
fig.show()
# 中国地图(需要安装)
# pip install plotly-geo

交互功能定制

1 悬停信息

fig = px.scatter(df, x='x', y='y', color='category')
fig.update_traces(
    hovertemplate='<b>X: %{x:.2f}</b><br>Y: %{y:.2f}<br>类别: %{color}',
    hoverlabel=dict(
        bgcolor='white',
        font_size=16,
        font_family='Arial'
    )
)
fig.show()

2 缩放和选择

fig.update_layout(
    dragmode='zoom',  # 鼠标拖拽缩放
    hovermode='x unified',  # 统一悬停模式
    selectdirection='h',  # 水平选择
    newshape=dict(line_color='red')  # 选择框颜色
)
fig.show()

导出图表

# 保存为HTML文件
fig.write_html("chart.html")
# 保存为图片(需要安装kaleido)
# fig.write_image("chart.png", width=800, height=600)
# 保存为JSON
import json
fig_json = fig.to_json()
with open("chart.json", "w") as f:
    json.dump(fig_json, f)

在Jupyter Notebook中显示

# Jupyter Notebook中直接显示
fig.show()
# 或者使用iplot
import plotly.offline as pyo
pyo.iplot(fig)
# 嵌入到HTML中
from plotly.offline import plot
plot(fig, include_plotlyjs=False, output_type='div')

实战示例:股票价格可视化

import yfinance as yf
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# 获取股票数据
stock = yf.download("AAPL", start="2023-01-01", end="2024-01-01")
# 创建子图
fig = make_subplots(rows=2, cols=1, 
                    shared_xaxes=True,
                    vertical_spacing=0.03,
                    subplot_titles=('股价走势', '成交量'),
                    row_width=[0.7, 0.3])
# 添加OHLC图表
fig.add_trace(go.Ohlc(x=stock.index,
                       open=stock['Open'],
                       high=stock['High'],
                       low=stock['Low'],
                       close=stock['Close'],
                       name='AAPL'),
              row=1, col=1)
# 添加成交量
fig.add_trace(go.Bar(x=stock.index,
                     y=stock['Volume'],
                     name='成交量'),
              row=2, col=1)
# 更新布局
fig.update_layout('Apple股票价格分析',
    xaxis_title='日期',
    yaxis_title='价格 ($)',
    template='plotly_dark',
    hovermode='x unified'
)
fig.show()

性能优化建议

# 大数据集优化
fig = go.Figure()
fig.add_trace(go.Scattergl(x=df['x'], y=df['y']))  # 使用WebGL渲染
fig.update_layout(
    uirevision=True,  # 保持UI状态
    hoverdistance=10,  # 减少悬停检测距离
    spikedistance=10   # 减少尖峰检测距离
)

这些示例涵盖了Plotly的主要交互功能,你可以根据具体需求组合使用这些功能,创建专业的数据可视化仪表板,需要更多特定功能的示例吗?

抱歉,评论功能暂时关闭!