Carpet Contour Plot in Julia

How to make carpet contour plots in Julia with Plotly.


Plotly is known for its graphing libraries, but it's also a broader ecosystem for building interactive data apps, AI data analysis tools, and deploying and hosting Dash apps. Explore the full set of tools and platforms designed to help turn data into action. Discover Plotly.

Note: We are retiring documentation for R, MATLAB, Julia, and F#. Learn more about this change here.

Basic Carpet Plot

Set the x and y coordinates, using x and y attributes. If x coordinate values are omitted a cheater plot will be created. To save parameter values use a and b attributes. To make changes to the axes, use aaxis or baxis attributes. For a more detailed list of axes attributes refer to julia reference.

using PlotlyJS

plot(carpet(
    a=[0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3],
    b=[4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6],
    x=[2, 3, 4, 5, 2.2, 3.1, 4.1, 5.1, 1.5, 2.5, 3.5, 4.5],
    y=[1, 1.4, 1.6, 1.75, 2, 2.5, 2.7, 2.75, 3, 3.5, 3.7, 3.75],
    aaxis=attr(
        tickprefix="a=",
        smoothing=0,
        minorgridcount=9,
        type="linear"
    ),
    baxis=attr(
        tickprefix="b=",
        smoothing=0,
        minorgridcount=9,
        type="linear"
    )
))

// TODO: Can"t use end as argument?

Add Contours

using PlotlyJS

trace1 = contourcarpet(
    a=[0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3],
    b=[4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6],
    z=[1, 1.96, 2.56, 3.0625, 4, 5.0625, 1, 7.5625, 9, 12.25, 15.21, 14.0625],
    autocontour=false,
    contours=attr(
        start=1,
        size=1
    ),
    contours_end=14,
    line=attr(
        width=2,
        smoothing=0
    ),
    colorbar=attr(
       len=0.4,
        y=0.25
    )
)

trace2 = carpet(
    a=[0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3],
    b=[4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6],
    x=[2, 3, 4, 5, 2.2, 3.1, 4.1, 5.1, 1.5, 2.5, 3.5, 4.5],
    y=[1, 1.4, 1.6, 1.75, 2, 2.5, 2.7, 2.75, 3, 3.5, 3.7, 3.75],
    aaxis=attr(
        tickprefix="a=",
        smoothing=0,
        minorgridcount=9,
        type="linear"
    ),
    baxis=attr(
        tickprefix="b=",
        smoothing=0,
        minorgridcount=9,
        type="linear"
    )
)

plot([trace1, trace2])

Add Multiple Traces

using PlotlyJS, HTTP, JSON

response = HTTP.get("https://raw.githubusercontent.com/bcdunbar/datasets/master/airfoil_data.json")
data = JSON.parse(String(response.body))

trace1 = carpet(
    a=data[1]["a"],
    b=data[1]["b"],
    x=data[1]["x"],
    y=data[1]["y"],
    baxis=attr(
      startline=false,
      endline=false,
      showticklabels="none",
      smoothing=0,
      showgrid=false
    ),
    aaxis=attr(
      startlinewidth=2,
      startline=true,
      showticklabels="none",
      endline=true,
      showgrid=false,
      endlinewidth=2,
      smoothing=0
    )
)

trace2 = contourcarpet(
    z=data[2]["z"],
    autocolorscale=false,
    zmax=1,
    name="Pressure",
    colorscale="Viridis",
    zmin=-8,
    colorbar=attr(
      y=0,
      yanchor="bottom",
      titleside="right",
      len=0.75,
      title="Pressure coefficient, c<sub>p</sub>"
    ),
    contours=attr(
      start=-1,
      size=0.025,
      showlines=false
    ),
    contours_end=1.000,
    line=attr(
      smoothing=0
    ),
    autocontour=false,
    zauto=false
)

trace3 = contourcarpet(
    z=data[3]["z"],
    opacity=0.300,
    showlegend=true,
    name="Streamlines",
    autocontour=true,
    ncontours=50,
    contours=attr(
      coloring="none"
    ),
    line=attr(
      color="white",
      width=1
    )
)

trace4 = contourcarpet(
    z=data[4]["z"],
    showlegend=true,
    name="Pressure<br>contours",
    autocontour=false,
    line=attr(
        color="rgba(0, 0, 0, 0.5)",
        smoothing=1
    ),
    contours=attr(
        size=0.250,
        start=-4,
        coloring="none",
        showlines=true
    ),
    contours_end=1.000,
)

trace5 = scatter(
    x=data[5]["x"],
    y=data[5]["y"],
    legendgroup="g1",
    name="Surface<br>pressure",
    mode="lines",
    hoverinfo="skip",
    line=attr(
      color="rgba(255, 0, 0, 0.5)",
      width=1,
      shape="spline",
      smoothing=1
    ),
    fill="toself",
    fillcolor="rgba(255, 0, 0, 0.2)"
)

trace6 = scatter(
    x=data[6]["x"],
    y=data[6]["y"],
    showlegend=false,
    legendgroup="g1",
    mode="lines",
    hoverinfo="skip",
    line=attr(
      color="rgba(255, 0, 0, 0.3)",
      width=1
    )
)

trace7 = scatter(
    x=data[7]["x"],
    y=data[7]["y"],
    showlegend=false,
    legendgroup="g1",
    name="cp",
    text=data[7]["text"],
    hoverinfo="text",
    mode="lines",
    line=attr(
      color="rgba(255, 0, 0, 0.2)",
      width=0
    )
)

layout = Layout(
    yaxis=attr(
      zeroline=false,
      range=[-1.800,1.800],
      showgrid=false
    ),
    dragmode="pan",
    height=700,
    xaxis=attr(
      zeroline=false,
      scaleratio=1,
      scaleanchor="y",
      range=[-3.800,3.800],
      showgrid=false
    ),
    title="Flow over a Karman-Trefftz airfoil",
    hovermode="closest",
    margin=attr(
      r=60,
      b=40,
      l=40,
      t=80
    ),
    width=900
)

plot([trace1, trace2, trace3, trace4, trace5, trace6, trace7], layout)

Reference

See https://plotly.com/julia/reference/contourcarpet/ for more information and chart attribute options!