How to make violin plots in Python with Plotly.
Plotly Studio: Transform any dataset into an interactive data application in minutes with AI. Sign up for early access now.
In [1]:
import plotly.express as px df = px.data.tips() fig = px.violin(df, y="total_bill") fig.show()Violin plot with box and data points¶
In [2]:
import plotly.express as px df = px.data.tips() fig = px.violin(df, y="total_bill", box=True, # draw box plot inside the violin points='all', # can be 'outliers', or False ) fig.show()
In [3]:
import plotly.express as px df = px.data.tips() fig = px.violin(df, y="tip", x="smoker", color="sex", box=True, points="all", hover_data=df.columns) fig.show()
In [4]:
import plotly.express as px df = px.data.tips() fig = px.violin(df, y="tip", color="sex", violinmode='overlay', # draw violins on top of each other # default violinmode is 'group' as in example above hover_data=df.columns) fig.show()
In [5]:
import plotly.graph_objects as go import pandas as pd df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/violin_data.csv") fig = go.Figure(data=go.Violin(y=df['total_bill'], box_visible=True, line_color='black', meanline_visible=True, fillcolor='lightseagreen', opacity=0.6, x0='Total Bill')) fig.update_layout(yaxis_zeroline=False) fig.show()
In [6]:
import plotly.graph_objects as go import pandas as pd df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/violin_data.csv") fig = go.Figure() days = ['Thur', 'Fri', 'Sat', 'Sun'] for day in days: fig.add_trace(go.Violin(x=df['day'][df['day'] == day], y=df['total_bill'][df['day'] == day], name=day, box_visible=True, meanline_visible=True)) fig.show()
In [7]:
import plotly.graph_objects as go import pandas as pd df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/violin_data.csv") fig = go.Figure() fig.add_trace(go.Violin(x=df['day'][ df['sex'] == 'Male' ], y=df['total_bill'][ df['sex'] == 'Male' ], legendgroup='M', scalegroup='M', name='M', line_color='blue') ) fig.add_trace(go.Violin(x=df['day'][ df['sex'] == 'Female' ], y=df['total_bill'][ df['sex'] == 'Female' ], legendgroup='F', scalegroup='F', name='F', line_color='orange') ) fig.update_traces(box_visible=True, meanline_visible=True) fig.update_layout(violinmode='group') fig.show()
In [8]:
import plotly.graph_objects as go import pandas as pd df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/violin_data.csv") fig = go.Figure() fig.add_trace(go.Violin(x=df['day'][ df['smoker'] == 'Yes' ], y=df['total_bill'][ df['smoker'] == 'Yes' ], legendgroup='Yes', scalegroup='Yes', name='Yes', side='negative', line_color='blue') ) fig.add_trace(go.Violin(x=df['day'][ df['smoker'] == 'No' ], y=df['total_bill'][ df['smoker'] == 'No' ], legendgroup='No', scalegroup='No', name='No', side='positive', line_color='orange') ) fig.update_traces(meanline_visible=True) fig.update_layout(violingap=0, violinmode='overlay') fig.show()
In [9]:
import plotly.graph_objects as go import pandas as pd df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/violin_data.csv") pointpos_male = [-0.9,-1.1,-0.6,-0.3] pointpos_female = [0.45,0.55,1,0.4] show_legend = [True,False,False,False] fig = go.Figure() for i in range(0,len(pd.unique(df['day']))): fig.add_trace(go.Violin(x=df['day'][(df['sex'] == 'Male') & (df['day'] == pd.unique(df['day'])[i])], y=df['total_bill'][(df['sex'] == 'Male')& (df['day'] == pd.unique(df['day'])[i])], legendgroup='M', scalegroup='M', name='M', side='negative', pointpos=pointpos_male[i], # where to position points line_color='lightseagreen', showlegend=show_legend[i]) ) fig.add_trace(go.Violin(x=df['day'][(df['sex'] == 'Female') & (df['day'] == pd.unique(df['day'])[i])], y=df['total_bill'][(df['sex'] == 'Female')& (df['day'] == pd.unique(df['day'])[i])], legendgroup='F', scalegroup='F', name='F', side='positive', pointpos=pointpos_female[i], line_color='mediumpurple', showlegend=show_legend[i]) ) # update characteristics shared by all traces fig.update_traces(meanline_visible=True, points='all', # show all points jitter=0.05, # add some jitter on points for better visibility scalemode='count') #scale violin plot area with total count fig.update_layout( title_text="Total bill distribution<br><i>scaled by number of bills per gender", violingap=0, violingroupgap=0, violinmode='overlay') fig.show()Ridgeline plot¶
A ridgeline plot (previously known as Joy Plot) shows the distribution of a numerical value for several groups. They can be used for visualizing changes in distributions over time or space.
In [10]:
import plotly.graph_objects as go from plotly.colors import n_colors import numpy as np np.random.seed(1) # 12 sets of normal distributed random data, with increasing mean and standard deviation data = (np.linspace(1, 2, 12)[:, np.newaxis] * np.random.randn(12, 200) + (np.arange(12) + 2 * np.random.random(12))[:, np.newaxis]) colors = n_colors('rgb(5, 200, 200)', 'rgb(200, 10, 10)', 12, colortype='rgb') fig = go.Figure() for data_line, color in zip(data, colors): fig.add_trace(go.Violin(x=data_line, line_color=color)) fig.update_traces(orientation='h', side='positive', width=3, points=False) fig.update_layout(xaxis_showgrid=False, xaxis_zeroline=False) fig.show()Violin Plot With Only Points¶
A strip chart is like a violin plot with points showing, and no violin:
In [11]:
import plotly.express as px df = px.data.tips() fig = px.strip(df, x='day', y='tip') fig.show()Choosing The Algorithm For Computing Quartiles¶
New in 5.10
By default, quartiles for violin plots are computed using the linear
method (for more about linear interpolation, see #10 listed on http://jse.amstat.org/v14n3/langford.html and https://en.wikipedia.org/wiki/Quartile for more details).
However, you can also choose to use an exclusive
or an inclusive
algorithm to compute quartiles.
The exclusive algorithm uses the median to divide the ordered dataset into two halves. If the sample is odd, it does not include the median in either half. Q1 is then the median of the lower half and Q3 is the median of the upper half.
The inclusive algorithm also uses the median to divide the ordered dataset into two halves, but if the sample is odd, it includes the median in both halves. Q1 is then the median of the lower half and Q3 the median of the upper half.
In [12]:
import plotly.express as px df = px.data.tips() fig = px.violin(df, y="total_bill") fig.update_traces(quartilemethod="exclusive") # or "inclusive", or "linear" by default fig.show()What About Dash?¶
Dash is an open-source framework for building analytical applications, with no Javascript required, and it is tightly integrated with the Plotly graphing library.
Learn about how to install Dash at https://dash.plot.ly/installation.
Everywhere in this page that you see fig.show()
, you can display the same figure in a Dash application by passing it to the figure
argument of the Graph
component from the built-in dash_core_components
package like this:
import plotly.graph_objects as go # or plotly.express as px fig = go.Figure() # or any Plotly Express function e.g. px.bar(...) # fig.add_trace( ... ) # fig.update_layout( ... ) from dash import Dash, dcc, html app = Dash() app.layout = html.Div([ dcc.Graph(figure=fig) ]) app.run(debug=True, use_reloader=False) # Turn off reloader if inside Jupyter
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4