本文目录导读:

我来详细介绍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的主要交互功能,你可以根据具体需求组合使用这些功能,创建专业的数据可视化仪表板,需要更多特定功能的示例吗?