################
Demo with mtcars
################

Import packages::

    from funkyheatmappy import funky_heatmap
    import pandas as pd

Load data::

    mtcars = pd.read_csv("../test/data/mtcars.csv")
    mtcars = mtcars.rename(columns={"Unnamed: 0": "id"})
    mtcars["data"] = (
            mtcars["data"].sort_values(by="mpg", ascending=False).reset_index(drop=True)
        )
    
We can plot this data frame without any additional formatting, though it doesn't look very nice::

    funky_heatmap(mtcars)

By defining a few additional formatting parameters, we can get the plot to look much nicer.

***********
Column info
***********

::
    
    column_info = pd.DataFrame(
        {
            "id": mtcars.columns,
            "group": [
                pd.NA,
                "overall",
                "overall",
                "group1",
                "group1",
                "group1",
                "group1",
                "group2",
                "group2",
                "group2",
                "group2",
                "group2",
            ],
            "name": [
                "",
                "Miles / gallon",
                "Number of cylinders",
                "Displacement (cu.in.)",
                "Gross horsepower",
                "Rear axle ratio",
                "Weight (1000 lbs)",
                "1/4 mile time",
                "Engine",
                "Transmission",
                "# Forward gears",
                "# Carburetors",
            ],
            "geom": [
                "text",
                "bar",
                "bar",
                "funkyrect",
                "funkyrect",
                "funkyrect",
                "funkyrect",
                "circle",
                "circle",
                "circle",
                "circle",
                "circle",
            ],
            "options": [
                {"ha": 0, "width": 6},
                {"width": 4, "legend": False},
                {"width": 4, "legend": False},
                dict(),
                dict(),
                dict(),
                dict(),
                dict(),
                dict(),
                dict(),
                dict(),
                dict(),
            ],
            "palette": [
                np.nan,
                "palette1",
                "palette2",
                "palette1",
                "palette1",
                "palette1",
                "palette1",
                "palette2",
                "palette2",
                "palette2",
                "palette2",
                "palette2",
            ],
        }
    )
    column_info.index = column_info["id"]


Define column groups
::

    column_groups = pd.DataFrame(
        {
            "Category": ["Overall", "Group1", "Group2"],
            "group": ["overall", "group1", "group2"],
            "palette": ["overall", "palette1", "palette2"],
        }
    )


********
Row info
********

Determine method grouping::

    row_info = pd.DataFrame({"id": mtcars["id"], "group": "test"}, index=mtcars["id"])
    row_groups = pd.DataFrame({"Group": ["Test"], "group": ["test"]})
    

********
Palettes
********

Determine palettes::

    palettes = pd.DataFrame(
        {
            "palettes": ["overall", "palette1", "palette2"],
            "colours": [colors, "Blues", "Reds"],
        }
    )


************
Funkyheatmap
************

::
     
    funky_heatmap(
        data=mtcars,
        column_info=mtcarscolumn_info,
        column_groups=column_groups,
        row_info=row_info,
        row_groups=row_groups,
        palettes=palettes,
        expand={"xmax": 4},
    )


**********
Add images
**********

Add a new column to the mtcars data and to the column info::


    mtcars["data"]["type"] = np.concatenate(
        (np.repeat("ice", 10), np.repeat("electric", 22))
    )

    mtcars["column_info"] = pd.concat(
        [
            mtcars["column_info"],
            pd.DataFrame(
                {
                    "id": ["type"],
                    "group": ["group2"],
                    "name": ["Type of engine"],
                    "geom": ["image"],
                    "options": [{"path": "../test/data/", "filetype": "png"}],
                    "palette": [np.nan],
                },
                index=["type"],
            ),
        ]
    )

Generate funkyheatmap::

    funky_heatmap(
        data=mtcars,
        column_info=column_info,
        column_groups=column_groups,
        row_info=row_info,
        row_groups=row_groups,
        palettes=palettes,
        expand={"xmax": 4},
    )

Additionally you can add a zoom parameter to the options in column info which is used to shrink or expand the image::

    mtcars["column_info"] = pd.concat(
        [
            mtcars["column_info"],
            pd.DataFrame(
                {
                    "id": ["type"],
                    "group": ["group2"],
                    "name": ["Type of engine"],
                    "geom": ["image"],
                    "options": [{"path": "../test/data/", "filetype": "png", "zoom": 0.5"}],
                    "palette": [np.nan],
                },
                index=["type"],
            ),
        ]
    )

    funky_heatmap(
        data=mtcars,
        column_info=column_info,
        column_groups=column_groups,
        row_info=row_info,
        row_groups=row_groups,
        palettes=palettes,
        expand={"xmax": 4},
    )
