Plotly를 활용하면 아주 간편히 버튼 생성이 가능합니다. 버튼을 활용하여 사용자가 직접 그래프 스타일 변경, 데이터 변경 등을 선택할수 있습니다. Plotly 인터렉티브 환경의 끝판왕 이라고 볼수있습니다.
fig.update_layout(
updatemenus=[
dict(
type = "buttons",
buttons=list([dict(label="None",
method= 버튼을 눌렀을때 어떤 기능을 수행할지 설정,
args = [...]method 에 맞춰 구체적인 동작 지정,
args2 = [...]버튼을 2번째 눌렀을때 구체적인 동작 지정,
label = 버튼 텍스트)]),
pad=버튼 패딩,
x= 버튼위치 x좌표,
y= 버튼위치 y좌표,
showactive={True, False} 현재 버튼 활성화 여부 판단,
active = 처음 그래프 생성 시 활성화 버튼 번호
),])
[사용 함수]
[함수 input 내용]
random_x=np.random.randint(1, 101, 100)
random_y=np.random.randint(1, 101, 100)
fig=px.Figure()
fig.add_trace(px.Scatter(x=random_x, y=random_y, mode='markers'))
fig.update_layout(
updatemenus=[
dict(
type="buttons",
buttons=list([
dict(args=["type", "scatter"],
label="Scatter Plot",
method="restyle"),
dict(args=["type", "bar"],
label="Bar Chart",
method="restyle")
]),
),
]
)
fig.show()
# 1번 버튼
dict(args=["type", "scatter"],
label="Scatter Plot",
method="restyle"),
# 2번 버튼
dict(args=["type", "bar"],
label="Bar Chart",
method="restyle")
실행 결과-1번 버튼 클릭

실행 결과-2번 버튼 클릭

fig = px.Figure()
x = ['A', 'B', 'C', 'D']
fig.add_trace(px.Bar(name='Data 1',x=x, y=[100, 200, 500, 673]))
fig.add_trace(px.Bar(name='Data 1',x=x, y=[56, 123, 982, 213]))
fig.update_layout(
updatemenus=[
dict(
type="buttons",
buttons=list([
dict(label="Both",
method="update",
args=[{"visible": [True, True]},
{"title": "Both"}]),
dict(label="Data 1",
method="update",
args=[{"visible": [True, False]},
{"title": "Data 1",}]),
dict(label="Data 2",
method="update",
args=[{"visible": [False, True]},
{"title": "Data 2",}]),
]),
),
]
)
fig.show()
# 1번 그래프
fig.add_trace(px.Bar(name='Data 1',x=x, y=[100, 200, 500, 673]))
# 2번 그래프
fig.add_trace(px.Bar(name='Data 1',x=x, y=[56, 123, 982, 213]))
# 1번 버튼
dict(label="Both",
method="update",
args=[{"visible": [True, True]},
{"title": "Both"}]),
# 2번 버튼
dict(label="Data 1",
method="update",
args=[{"visible": [True, False]},
{"title": "Data 1",}]),
# 3번 버튼
dict(label="Data 2",
method="update",
args=[{"visible": [False, True]},
{"title": "Data 2",}])
실행 결과-1번 버튼 클릭

실행 결과-2번 버튼 클릭

실행 결과-3번 버튼 클릭

x=np.linspace(-np.pi, np.pi, 10)
y1=np.sin(x)
y2=np.tan(x)
fig=px.Figure()
fig.add_traces(px.Scatter(x=x, y=y1, visible=True, showlegend=True))
fig.update_layout(
updatemenus=[
dict(
type="buttons",
buttons=list([
dict(label="Toggle Sine / Tangent",
method="restyle",
args=[{'y': [y1]}],
args2=[{'y': [y2]}],
),
])
),
],
)
fig.show()
dict(label="Toggle Sine / Tangent",
method="restyle",
args=[{'y': [y1]}],
args2=[{'y': [y2]}],
)
실행 결과-1

실행 결과-2

fig.update_layout(
updatemenus=[
dict(
type = "buttons",
font_color = 텍스트 색,
font_family = 텍스트 서체,
font_size = 텍스트 사이즈,
bgcolor = 배경색,
bordercolr = 테두리색,
borderwidth = 테두리 두깨,
),])
[사용 함수]
[함수 input 내용]
예제)
fig = px.Figure()
x = ['A', 'B', 'C', 'D']
fig.add_trace(px.Bar(name='Data 1',x=x, y=[100, 200, 500, 673]))
fig.add_trace(px.Bar(name='Data 1',x=x, y=[56, 123, 982, 213]))
fig.update_layout(
updatemenus=[
dict(
type="buttons",
buttons=list([
dict(label="Both",
method="update",
args=[{"visible": [True, True]},
{"title": "Both"}]),
dict(label="Data 1",
method="update",
args=[{"visible": [True, False]},
{"title": "Data 1",
}]),
dict(label="Data 2",
method="update",
args=[{"visible": [False, True]},
{"title": "Data 2",
}]),
]),
font_color = 'red',
font_size = 20 ,
bgcolor = 'blue',
borderwidth = 2
),
]
)
fig.show()

Plotly의 슬라이더 기능을 활용하면 아주 간단한 코드로 시간의 변화 또는 범부 변화에 따른 경향 확인기 가능합니다.
import plotly.express as px
df = px.data.gapminder()
fig = px.scatter(df, x="gdpPercap", y="lifeExp",size="pop", color="continent",
log_x=True, size_max=55, range_x=[100,100000], range_y=[25,90],
animation_frame="year")
fig["layout"].pop("updatemenus")
fig.show()
실행 결과

특정 범위를 선택할수 있게 도와주는 슬라이더를 범위 슬라이더(range slider) 라고 합니다. 범위 슬라이더를 추가하려면 아래 코드를 추가해야 합니다.
df = px.data.tips()
fig = px.scatter(df, x="total_bill", y="tip", color="sex",)
fig.update_layout(xaxis=dict(rangeslider_visible=True))
fig.show()
[사용 함수] - fig.update_layout()
[Input 내용] - xaxis : x축 관련 설정 - rangeslider_visible = True
실행 결과

직접 슬라이더 한 step 씩 만들기 위해서는 2단계의 과정이 필요합니다.
import plotly.graph_objects as go
import numpy as np
fig = go.Figure()
for step in np.arange(0, 3, 0.1):
fig.add_trace(
go.Scatter(
visible=False,
line=dict(color="#00CED1", width=6),
name="𝜈 = " + str(step),
x=np.arange(0, 10, 0.02),
y=np.sin(step * np.arange(0, 10, 0.02))))
len(fig.data)
steps = []
for i in range(len(fig.data)):
step = dict(
method="update",
args=[{"visible": [False] * len(fig.data)},
{"title": "Slider switched to step: " + str(i)}], # layout attribute
)
step["args"][0]["visible"][i] = True # Toggle i'th trace to "visible"
steps.append(step)
fig.update_layout(
sliders = [dict(
active=10,
currentvalue={"prefix": "Frequency: "},
pad={"t": 50},
steps=steps
)])
fig.update_layout(
sliders = [dict(
active=10,
currentvalue={"prefix": "Frequency: "},
pad={"t": 50},
steps=steps
)])
최종 코드 종합
import plotly.graph_objects as go
import numpy as np
fig = go.Figure()
# 각 스텝 별 그래프(Trace)를 만들기
for step in np.arange(0, 3, 0.1):
fig.add_trace(
go.Scatter(
visible=False,
line=dict(color="#00CED1", width=6),
name="𝜈 = " + str(step),
x=np.arange(0, 10, 0.02),
y=np.sin(step * np.arange(0, 10, 0.02))))
# 처음 그래프 생성했을땐 index 10의 Trace 가 보이게 설정
fig.data[10].visible = True
# 스텝 별 슬라이더 데이터 리스트 생성
steps = []
for i in range(len(fig.data)):
step = dict(
method="update",
args=[{"visible": [False] * len(fig.data)},
{"title": "Slider switched to step: " + str(i)}], # layout attribute
)
step["args"][0]["visible"][i] = True # Toggle i'th trace to "visible"
steps.append(step)
# 최종 슬라이더 데이터 업데이트
fig.update_layout(
sliders = [dict(
active=10,
currentvalue={"prefix": "Frequency: "},
pad={"t": 50},
steps=steps
)])
fig.show()
실행 결과

fig.update_layout(
sliders=[
dict(
type = "buttons",
font_color = 텍스트 색,
font_family = 텍스트 서체,
font_size = 텍스트 사이즈,
bgcolor = 배경색,
bordercolr = 테두리색,
borderwidth = 테두리 두깨,
),])
[사용 함수]
[함수 input 내용]
예제)
# Figure 생성
fig = go.Figure()
# 각 스텝 별 그래프(Trace)를 만들기
for step in np.arange(0, 3, 0.1):
fig.add_trace(
go.Scatter(
visible=False,
line=dict(color="#00CED1", width=6),
name="𝜈 = " + str(step),
x=np.arange(0, 10, 0.02),
y=np.sin(step * np.arange(0, 10, 0.02))))
# 처음 그래프 생성했을땐 index 10의 Trace 가 보이게 설정
fig.data[10].visible = True
# 스텝 별 슬라이더 데이터 리스트 생성
steps = []
for i in range(len(fig.data)):
step = dict(
method="update",
args=[{"visible": [False] * len(fig.data)},
{"title": "Slider switched to step: " + str(i)}], # layout attribute
)
step["args"][0]["visible"][i] = True # Toggle i'th trace to "visible"
steps.append(step)
# 최종 슬라이더 데이터 업데이트
fig.update_layout(
sliders = [dict(
active=10,
currentvalue={"prefix": "Frequency: "},
pad={"t": 50},
steps=steps,
bgcolor="blue",
font_color = "red",
font_size= 20,
ticklen = 3 ,
tickcolor = "green",
)])
fig.show()
실행 결과
