Difference between revisions of "Fancy Plots using Plotly"

m (Syntax test)
m (Added Dataframe code)
 
(9 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{Nutshell|elegant plots for adding in to research papers.|title=}}
+
{{Nutshell|elegant plots for adding in to research papers.|title=Plotly}}
  
 
*This is a collection of simple plots using the plotly library.
 
*This is a collection of simple plots using the plotly library.
Line 6: Line 6:
  
 
==Installation==
 
==Installation==
We need the [https://pypi.org/project/plotly-express/ plotly-express] library.
+
We need the [https://pypi.org/project/plotly-express/ plotly-express] and [https://pypi.org/project/kaleido/ kaleido] library.
  
 
====Conda====
 
====Conda====
 
<syntaxhighlight lang="shell">
 
<syntaxhighlight lang="shell">
 
conda install -c plotly plotly_express==0.4.0
 
conda install -c plotly plotly_express==0.4.0
</syntaxhighlight><br />
+
conda install -c conda-forge python-kaleido
conda install -c plotly plotly_express==0.4.0
+
</syntaxhighlight>
  
 
====Pip====
 
====Pip====
pip install plotly_express==0.4.0
+
<syntaxhighlight lang="shell">
 +
pip install plotly_express==0.4.0
 +
pip install kaleido
 +
</syntaxhighlight>
  
 
==Line Plots==
 
==Line Plots==
<syntaxhighlight lang="python3">
+
CSV Data
# x and y given as array_like objects
+
 
 +
<syntaxhighlight lang="python">
 +
animal,age,cuteness
 +
cat,1,5
 +
cat,2,8
 +
cat,3,12
 +
cat,4,15
 +
cat,5,14
 +
cat,6,15
 +
cat,7,16
 +
cat,8,18
 +
cat,9,17
 +
cat,10,10
 +
dog,1,12
 +
dog,2,14
 +
dog,3,18
 +
dog,4,20
 +
dog,5,19
 +
dog,6,17
 +
dog,7,14
 +
dog,8,9
 +
dog,9,8
 +
dog,10,6
 +
</syntaxhighlight>
 +
 
 +
Code
 +
 
 +
<syntaxhighlight lang="py" line="1">
 
import plotly.express as px
 
import plotly.express as px
fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])
+
import pandas as pd
 +
from tqdm import tqdm
 +
 
 +
PLOTS_DIR = "./plots"
 +
PLOT_NAME = "cat_v_dog"
 +
PLOT_TYPES = ["svg", "png", "html", "pdf", "jpeg"]
 +
FIG_DIR = PLOTS_DIR + "/" + PLOT_NAME
 +
!mkdir -p $FIG_DIR
 +
 
 +
# Plot Size
 +
PLOT_WIDTH = 800
 +
PLOT_HEIGHT = 300
 +
 
 +
 
 +
df = pd.read_csv('./data/sample.csv')
 +
fig = px.line(df, x="age", y="cuteness", color="animal")
 +
fig.update_layout(
 +
    title="Cat vs Dog Cuteness",
 +
    xaxis_title="Animal's Age",
 +
    yaxis_title="Cuteness Rating",
 +
    legend_title="Animal",
 +
    font=dict(
 +
        family="Courier New, monospace",
 +
        size=14,
 +
        color="RebeccaPurple"
 +
    )
 +
)
 +
 
 +
fig.update_layout(
 +
    autosize=True,
 +
    width=PLOT_WIDTH,
 +
    height=PLOT_HEIGHT,
 +
    margin=dict(
 +
        l=50,
 +
        r=50,
 +
        b=50,
 +
        t=50,
 +
        pad=4
 +
    ),
 +
    legend=dict(
 +
        yanchor="top",
 +
        y=0.999,
 +
        xanchor="left",
 +
        x=0.001)
 +
)
 +
 
 
fig.show()
 
fig.show()
 +
# Save Plot
 +
for i in tqdm(range(len(PLOT_TYPES))):
 +
    if PLOT_TYPES[i] == "html":
 +
        fig.write_html(FIG_DIR + "/" + PLOT_NAME + "." + PLOT_TYPES[i])
 +
    else:
 +
        fig.write_image(FIG_DIR + "/" + PLOT_NAME + "." + PLOT_TYPES[i], scale=5)
 
</syntaxhighlight>
 
</syntaxhighlight>
<br /><syntaxhighlight lang="python3">
+
 
 +
Output
 +
 
 +
[[File:Cat vs dog cuteness.png|frameless|733x733px]]
 +
 
 +
==== Creating DataFrame from Arrays ====
 +
<syntaxhighlight lang="py">
 +
TOTAL_NUMBERS = 1000
 +
y = np.zeros(TOTAL_NUMBERS)
 +
x = np.zeros(TOTAL_NUMBERS)
 +
df = pd.DataFrame(data={"X_Label": x, "Y_Label": y})
 +
</syntaxhighlight>
 +
 
 +
==Scatter Plots==
 +
CSV Data
 +
 
 +
<syntaxhighlight lang="py" line="1">
 +
type,area,price
 +
Condo,900,100
 +
Apartment,565,250
 +
Condo,500,80
 +
Apartment,800,75
 +
Condo,750,100
 +
Condo,850,110
 +
Apartment,790,120
 +
Condo,755,60
 +
Apartment,325,125
 +
Condo,300,50
 +
</syntaxhighlight>
 +
 
 +
Code
 +
 
 +
<syntaxhighlight lang="py" line="1">
 
import plotly.express as px
 
import plotly.express as px
fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])
+
import pandas as pd
 +
from tqdm import tqdm
 +
 
 +
PLOTS_DIR = "./plots"
 +
PLOT_NAME = "house_price"
 +
PLOT_TYPES = ["svg", "png", "html", "pdf", "jpeg"]
 +
FIG_DIR = PLOTS_DIR + "/" + PLOT_NAME
 +
!mkdir -p $FIG_DIR
 +
 
 +
# Plot Size
 +
PLOT_WIDTH = 800
 +
PLOT_HEIGHT = 300
 +
 
 +
 
 +
df = pd.read_csv('./data/scatter.csv')
 +
fig = px.scatter(df, x="area", y="price", color="type")
 +
 
 +
 
 +
fig.update_layout(
 +
    title="House Pricing",
 +
    xaxis_title="Area",
 +
    yaxis_title="Price",
 +
    legend_title="House Price",
 +
    font=dict(
 +
        family="Courier New, monospace",
 +
        size=14,
 +
        color="RebeccaPurple"
 +
    )
 +
)
 +
 
 +
fig.update_layout(
 +
    autosize=True,
 +
    width=PLOT_WIDTH,
 +
    height=PLOT_HEIGHT,
 +
    margin=dict(
 +
        l=50,
 +
        r=50,
 +
        b=50,
 +
        t=50,
 +
        pad=4
 +
    ),
 +
    legend=dict(
 +
        yanchor="top",
 +
        y=0.999,
 +
        xanchor="left",
 +
        x=0.001)
 +
)
 
fig.show()
 
fig.show()
</syntaxhighlight><br /><syntaxhighlight lang="python">
+
# Save Plot
# x and y given as array_like objects
+
for i in tqdm(range(len(PLOT_TYPES))):
import plotly.express as px
+
    if PLOT_TYPES[i] == "html":
fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])
+
        fig.write_html(FIG_DIR + "/" + PLOT_NAME + "." + PLOT_TYPES[i])
fig.show()
+
    else:
</syntaxhighlight><br />
+
        fig.write_image(FIG_DIR + "/" + PLOT_NAME + "." + PLOT_TYPES[i], scale=5)
 +
</syntaxhighlight>
 +
 
 +
Output
 +
 
 +
[[File:House Pricing Plot.png|frameless|750x750px]]
 +
 
 +
==Bar Plots==
 +
CSV Data
 +
 
 +
Code
 +
 
 +
Output
 +
 
 +
==Radar Plots==
 +
CSV Data
 +
 
 +
Code
 +
 
 +
Output
 +
 
 +
==Pie Charts==
 +
CSV Data
 +
 
 +
Code
 +
 
 +
Output
 +
 
 +
==Bubble Charts==
 +
CSV Data
 +
 
 +
Code
 +
 
 +
Output
 +
 
 +
==Box Plots==
 +
CSV Data
 +
 
 +
Code
 +
 
 +
Output
 +
 
 +
==2D Histograms==
 +
CSV Data
 +
 
 +
Code
  
==Scatter Plots==
+
Output

Latest revision as of 13:47, 15 March 2022


  • This is a collection of simple plots using the plotly library.
  • It consists of elegant color schemes and easy to ready adjustable fonts.
  • The reason for using plotly is that it allows for HTML plots that can be scaled and zoomed after plotting.

Installation

We need the plotly-express and kaleido library.

Conda

conda install -c plotly plotly_express==0.4.0
conda install -c conda-forge python-kaleido

Pip

pip install plotly_express==0.4.0
pip install kaleido

Line Plots

CSV Data

animal,age,cuteness
cat,1,5
cat,2,8
cat,3,12
cat,4,15
cat,5,14
cat,6,15
cat,7,16
cat,8,18
cat,9,17
cat,10,10
dog,1,12
dog,2,14
dog,3,18
dog,4,20
dog,5,19
dog,6,17
dog,7,14
dog,8,9
dog,9,8
dog,10,6

Code

import plotly.express as px
import pandas as pd
from tqdm import tqdm

PLOTS_DIR = "./plots"
PLOT_NAME = "cat_v_dog"
PLOT_TYPES = ["svg", "png", "html", "pdf", "jpeg"]
FIG_DIR = PLOTS_DIR + "/" + PLOT_NAME
!mkdir -p $FIG_DIR

# Plot Size
PLOT_WIDTH = 800
PLOT_HEIGHT = 300


df = pd.read_csv('./data/sample.csv')
fig = px.line(df, x="age", y="cuteness", color="animal")
fig.update_layout(
    title="Cat vs Dog Cuteness",
    xaxis_title="Animal's Age",
    yaxis_title="Cuteness Rating",
    legend_title="Animal",
    font=dict(
        family="Courier New, monospace",
        size=14,
        color="RebeccaPurple"
    )
)

fig.update_layout(
    autosize=True,
    width=PLOT_WIDTH,
    height=PLOT_HEIGHT,
    margin=dict(
        l=50,
        r=50,
        b=50,
        t=50,
        pad=4
    ),
    legend=dict(
        yanchor="top",
        y=0.999,
        xanchor="left",
        x=0.001)
)

fig.show()
# Save Plot
for i in tqdm(range(len(PLOT_TYPES))):
    if PLOT_TYPES[i] == "html":
        fig.write_html(FIG_DIR + "/" + PLOT_NAME + "." + PLOT_TYPES[i])
    else:
        fig.write_image(FIG_DIR + "/" + PLOT_NAME + "." + PLOT_TYPES[i], scale=5)

Output

Cat vs dog cuteness.png

Creating DataFrame from Arrays

TOTAL_NUMBERS = 1000
y = np.zeros(TOTAL_NUMBERS)
x = np.zeros(TOTAL_NUMBERS)
df = pd.DataFrame(data={"X_Label": x, "Y_Label": y})

Scatter Plots

CSV Data

type,area,price
Condo,900,100
Apartment,565,250
Condo,500,80
Apartment,800,75
Condo,750,100
Condo,850,110
Apartment,790,120
Condo,755,60
Apartment,325,125
Condo,300,50

Code

import plotly.express as px
import pandas as pd
from tqdm import tqdm

PLOTS_DIR = "./plots"
PLOT_NAME = "house_price"
PLOT_TYPES = ["svg", "png", "html", "pdf", "jpeg"]
FIG_DIR = PLOTS_DIR + "/" + PLOT_NAME
!mkdir -p $FIG_DIR

# Plot Size
PLOT_WIDTH = 800
PLOT_HEIGHT = 300


df = pd.read_csv('./data/scatter.csv')
fig = px.scatter(df, x="area", y="price", color="type")


fig.update_layout(
    title="House Pricing",
    xaxis_title="Area",
    yaxis_title="Price",
    legend_title="House Price",
    font=dict(
        family="Courier New, monospace",
        size=14,
        color="RebeccaPurple"
    )
)

fig.update_layout(
    autosize=True,
    width=PLOT_WIDTH,
    height=PLOT_HEIGHT,
    margin=dict(
        l=50,
        r=50,
        b=50,
        t=50,
        pad=4
    ),
    legend=dict(
        yanchor="top",
        y=0.999,
        xanchor="left",
        x=0.001)
)
fig.show()
# Save Plot
for i in tqdm(range(len(PLOT_TYPES))):
    if PLOT_TYPES[i] == "html":
        fig.write_html(FIG_DIR + "/" + PLOT_NAME + "." + PLOT_TYPES[i])
    else:
        fig.write_image(FIG_DIR + "/" + PLOT_NAME + "." + PLOT_TYPES[i], scale=5)

Output

House Pricing Plot.png

Bar Plots

CSV Data

Code

Output

Radar Plots

CSV Data

Code

Output

Pie Charts

CSV Data

Code

Output

Bubble Charts

CSV Data

Code

Output

Box Plots

CSV Data

Code

Output

2D Histograms

CSV Data

Code

Output