diff --git a/docs/tutorials/data_visualization.ipynb b/docs/tutorials/data_visualization.ipynb index 00c309193..1304d2cdb 100644 --- a/docs/tutorials/data_visualization.ipynb +++ b/docs/tutorials/data_visualization.ipynb @@ -332,6 +332,64 @@ "* The last boxplot, `survived`, depicts the survival rate of all passengers between 0.0 and 1.0. It is clear that box plot is not a good graphic display for such a variable because it is either a passenger survived (1) or died (0)." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Violinplot\n", + "\n", + "Like boxplots, violinplots are also univariate but can offer a more precise visualisation of the underlying distribution of your data." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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QRO9T88995wuv/xy/e53v9OWLVv0iU98QldffTXveVPFRMW78MILzRUrVow+zufzZltbm7l27doxz1+xYoV52WWXHXFs1apV5sUXXzylddrdRO/T7NmzzQceeOCIY9dee615/fXXT2mdGCHJ/M1vfvO+59x6663mWWeddcSxT3/60+bSpUunsDIcbjz36XCXXnqp+Xd/93dTVg/GNtH7dNCZZ55prlmzpvQFwaQFsMJls1lt2bJFS5YsGT3mdDq1ZMkSbdq0acznfOQjH9GWLVtGux/fffdd/e53v9Nf/uVfTkvNdjSZ+5TJZOTz+Y445vf79ec//3lKa8X4bdq06Yh7KklLly497j0FMH6FQkGxWExNTU1Wl1KVaqwuAMUZGBhQPp9XS0vLEcdbWlr01ltvjfmcz372sxoYGNAll1wi0zSVy+X0pS99iS7gKTSZ+7R06VLdc889+tjHPqaFCxdq48aN+vWvf618Pj8dJWMcent7x7yn0WhUqVRKfr/fosqAyvc//sf/UDwe19/8zd9YXUpVogXQhp555hndfffdeuihh7R161b9+te/1m9/+1t961vfsro0HOZ73/ueTj31VC1atEgej0df/epXdeONN8rp5NcWQHVbv3691qxZo1/84heaNWuW1eVUJVoAK9yMGTPkcrnU19d3xPG+vj61traO+Zzbb79dN9xwg77whS9Ikj74wQ8qkUjoi1/8ov77f//vBIwpMJn7NHPmTD3xxBNKp9MaHBxUW1ubbrvtNp188snTUTLGobW1dcx7GgwGaf0DJunf/u3f9IUvfEGPP/74MUMsUDr8pa9wHo9H559/vjZu3Dh6rFAoaOPGjero6BjzOclk8piQ53K5JEkmW0NPicncp4N8Pp/mzJmjXC6nX/3qV/rkJz851eVinDo6Oo64p5L09NNPn/CeAhjbz372M91444362c9+pquuusrqcqoaLYBVYNWqVVq+fLkuuOACXXjhhbrvvvuUSCR04403SpI+97nPac6cOVq7dq0k6eqrr9Y999yj8847T4sXL9auXbt0++236+qrrx4Ngii9id6n559/Xl1dXTr33HPV1dWlb3zjGyoUCrr11lut/DaqWjwe165du0Yfd3Z2avv27WpqatK8efO0evVqdXV16Uc/+pEk6Utf+pIeeOAB3Xrrrfr85z+v//t//69+8Ytf6Le//a1V34ItTPQ+SdL27dtHn3vgwAFt375dHo9HZ5555nSXbxsTvU/r16/X8uXL9b3vfU+LFy9Wb2+vpJHJb6FQyJLvoapZPQ0ZpXH//feb8+bNMz0ej3nhhReamzdvHv3apZdeai5fvnz0sWEY5je+8Q1z4cKFps/nM9vb282vfOUrZjgcnv7CbWYi9+mZZ54xzzjjDNPr9ZrNzc3mDTfcYHZ1dVlQtX386U9/MiUd83Hwvixfvty89NJLj3nOueeea3o8HvPkk082161bN+11281k7tNY58+fP3/aa7eTid6nSy+99H3PR2k5TJM+PwAAADthDCAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDN/P9tF2zgldg+rQAAAABJRU5ErkJggg==", + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titanic_numerical.get_column(\"age\").plot.violin_plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Violinplots of all numerical columns" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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79xW86U+fPhwREdHOz12796NkpISz14Q8WvLly/HmTNnkJSUhL59+2LhwoVN+tLq1KlTnW133XWXy76qTdG2bVunv2tuWjX9bWoSwTs/3xEREU43OABYvHgxVCoV7rrrLnTv3h1z5szB77//3qx4Xn31VUgkEvTt2xedOnVCZmYmfvnlF5f73vledOjQAWw22/Fe3LhxA2w2u07scXFxUCgUjmtrjsau8cqVK2AYBvPmzatT7hcsWAAAjrLvjveLVGvss/DLL79gxIgRCAsLg0KhQHR0NP7xj38AgMsE8E6XL19Gbm5unf+nI0aMAIA63+eNlauGzJgxA3fddRceeOABJCYm4m9/+xtyc3MbPa62q1evgs1mIzU1tdF974y1Jt6mxFrbjRs3EB8fD4lE4rS9c+fOLvfncrlITEx02nb58mWo1WrExMTUea91Ol2j73NLY28t6gMY4F544QVs3LgRM2fORHp6OuRyOVgsFh5//PEWTcdRc8x//vMfxMXF1Xmey6WPTCgbP348Bg8ejB07dmD37t1466238Oabb+Krr77CAw884LU4OByOy+0MwzT7XEOGDMHVq1fx3//+F7t378a//vUvrFy5EuvWrcPUqVObdI6uXbvi4sWL2LlzJ3Jzc/Hll19izZo1mD9/PhYtWtTgsXfWbDS2vSlsNpvT341dY025f/nll+vUItWoSUjd8X4R12r/P7969Sruv/9+dOnSBStWrEBSUhL4fD6+++47rFy5ss73e+3awhp2ux0jR47EK6+84vL17rrrLqe/W1OuYmJicOrUKezatQvff/89vv/+e2zcuBETJ07E5s2bGz2+udz5HdAcAoGgTu2k3W5HTEwMPv30U5fHREdHO/3tq9jvRHfzAPfFF19g0qRJeOeddxzbjEZjnRFMycnJuHLlSp3j79zWoUMHANWFueZXIiG1xcfHY8aMGZgxYwZKSkrQu3dvLF26tMEE0FVz4aVLlzw2oCg5ORlA9ee7ds1IeXm5y1/ZERERmDJlCqZMmQKdTochQ4Zg4cKFzUpowsLCMGHCBEyYMAFmsxmPPPIIli5diuzsbAiFQsd+ly9fdorpypUrsNvtjvciOTkZdrsdly9fRteuXR37FRcXQ6VSOa4NqK41uLOsm81mFBUVNesa27dvD6B6Gp+mlHt3vF+k4c/C//73P5hMJnzzzTdO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", + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titanic_numerical.plot.violin_plots()" + ] + }, { "cell_type": "markdown", "metadata": { @@ -348,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2024-06-20T18:48:43.336423700Z", @@ -364,7 +422,7 @@ "" ] }, - "execution_count": 8, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -393,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2024-06-20T18:48:43.660060600Z", @@ -409,7 +467,7 @@ "" ] }, - "execution_count": 9, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -445,7 +503,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2024-06-20T18:48:43.776868800Z", @@ -461,7 +519,7 @@ "" ] }, - "execution_count": 10, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } diff --git a/src/safeds/data/tabular/plotting/_column_plotter.py b/src/safeds/data/tabular/plotting/_column_plotter.py index 1ba568525..3fd159f25 100644 --- a/src/safeds/data/tabular/plotting/_column_plotter.py +++ b/src/safeds/data/tabular/plotting/_column_plotter.py @@ -56,7 +56,6 @@ def box_plot(self, *, theme: Literal["dark", "light"] = "light") -> Image: """ if self._column.row_count > 0: _check_column_is_numeric(self._column, operation="create a box plot") - import matplotlib.pyplot as plt def _set_boxplot_colors(box: dict, theme: str) -> None: @@ -127,6 +126,73 @@ def _set_boxplot_colors(box: dict, theme: str) -> None: return _figure_to_image(fig) + def violin_plot(self, *, theme: Literal["dark", "light"] = "light") -> Image: + """ + Create a violin plot for the values in the column. This is only possible for numeric columns. + + Parameters + ---------- + theme: + The color theme of the plot. Default is "light". + + Returns + ------- + plot: + The violin plot as an image. + + Raises + ------ + TypeError + If the column is not numeric. + + Examples + -------- + >>> from safeds.data.tabular.containers import Column + >>> column = Column("test", [1, 2, 3]) + >>> violinplot = column.plot.violin_plot() + """ + if self._column.row_count > 0: + _check_column_is_numeric(self._column, operation="create a violin plot") + from math import nan + + import matplotlib.pyplot as plt + + style = "dark_background" if theme == "dark" else "default" + with plt.style.context(style): + if theme == "dark": + plt.rcParams.update( + { + "text.color": "white", + "axes.labelcolor": "white", + "axes.edgecolor": "white", + "xtick.color": "white", + "ytick.color": "white", + "grid.color": "gray", + "grid.linewidth": 0.5, + }, + ) + else: + plt.rcParams.update( + { + "grid.linewidth": 0.5, + }, + ) + + fig, ax = plt.subplots() + data = self._column._series.drop_nulls() + if len(data) == 0: + data = [nan, nan] + ax.violinplot( + data, + ) + + ax.set(title=self._column.name) + + ax.yaxis.grid(visible=True) + fig.tight_layout() + + return _figure_to_image(fig) + def histogram(self, *, max_bin_count: int = 10, theme: Literal["dark", "light"] = "light") -> Image: """ Create a histogram for the values in the column. diff --git a/src/safeds/data/tabular/plotting/_table_plotter.py b/src/safeds/data/tabular/plotting/_table_plotter.py index 4d6a253c2..fe7aa3fd2 100644 --- a/src/safeds/data/tabular/plotting/_table_plotter.py +++ b/src/safeds/data/tabular/plotting/_table_plotter.py @@ -119,20 +119,102 @@ def box_plots(self, *, theme: Literal["dark", "light"] = "light") -> Image: fig.delaxes(axs[number_of_rows - 1, i]) fig.tight_layout() + return _figure_to_image(fig) + + def violin_plots(self, *, theme: Literal["dark", "light"] = "light") -> Image: + """ + Create a violin plot for every numerical column. + + Parameters + ---------- + theme: + The color theme of the plot. Default is "light". + + Returns + ------- + plot: + The violin plot(s) as an image. + + Raises + ------ + NonNumericColumnError + If the table contains only non-numerical columns. + + Examples + -------- + >>> from safeds.data.tabular.containers import Table + >>> table = Table({"a": [1, 2], "b": [3, 42]}) + >>> image = table.plot.violin_plots() + """ + numerical_table = self._table.remove_non_numeric_columns() + if numerical_table.column_count == 0: + raise NonNumericColumnError("This table contains only non-numerical columns.") + from math import ceil + + import matplotlib.pyplot as plt + + style = "dark_background" if theme == "dark" else "default" + with plt.style.context(style): + if theme == "dark": + plt.rcParams.update( + { + "text.color": "white", + "axes.labelcolor": "white", + "axes.edgecolor": "white", + "xtick.color": "white", + "ytick.color": "white", + "grid.color": "gray", + "grid.linewidth": 0.5, + }, + ) + else: + plt.rcParams.update( + { + "grid.linewidth": 0.5, + }, + ) + + columns = numerical_table.to_columns() + columns = [column._series.drop_nulls() for column in columns] + max_width = 3 + number_of_columns = len(columns) if len(columns) <= max_width else max_width + number_of_rows = ceil(len(columns) / number_of_columns) + + fig, axs = plt.subplots(nrows=number_of_rows, ncols=number_of_columns) + line = 0 + for i, column in enumerate(columns): + data = column.to_list() + + if i % number_of_columns == 0 and i != 0: + line += 1 + + if number_of_columns == 1: + axs.violinplot( + data, + ) + axs.set_title(numerical_table.column_names[i]) + break - style = "dark_background" if theme == "dark" else "default" - with plt.style.context(style): - if theme == "dark": - plt.rcParams.update( - { - "text.color": "white", - "axes.labelcolor": "white", - "axes.edgecolor": "white", - "xtick.color": "white", - "ytick.color": "white", - }, + if number_of_rows == 1: + axs[i].violinplot( + data, + ) + axs[i].set_title(numerical_table.column_names[i]) + + else: + axs[line, i % number_of_columns].violinplot( + data, ) - return _figure_to_image(fig) + axs[line, i % number_of_columns].set_title(numerical_table.column_names[i]) + + # removes unused ax indices, so there wont be empty plots + last_filled_ax_index = len(columns) % number_of_columns + for i in range(last_filled_ax_index, number_of_columns): + if number_of_rows != 1 and last_filled_ax_index != 0: + fig.delaxes(axs[number_of_rows - 1, i]) + + fig.tight_layout() + return _figure_to_image(fig) def correlation_heatmap(self, *, theme: Literal["dark", "light"] = "light") -> Image: """ diff --git a/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_dark_snapshot[empty].png b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_dark_snapshot[empty].png new file mode 100644 index 000000000..d8e306a65 Binary files /dev/null and b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_dark_snapshot[empty].png differ diff --git a/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_dark_snapshot[multiple rows].png b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_dark_snapshot[multiple rows].png new file mode 100644 index 000000000..fcc00a4cf Binary files /dev/null and b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_dark_snapshot[multiple rows].png differ diff --git a/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_dark_snapshot[one row].png b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_dark_snapshot[one row].png new file mode 100644 index 000000000..c850594a9 Binary files /dev/null and b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_dark_snapshot[one row].png differ diff --git a/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_snapshot[empty].png b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_snapshot[empty].png new file mode 100644 index 000000000..f9f43b936 Binary files /dev/null and b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_snapshot[empty].png differ diff --git a/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_snapshot[multiple rows].png b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_snapshot[multiple rows].png new file mode 100644 index 000000000..c081f499c Binary files /dev/null and b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_snapshot[multiple rows].png differ diff --git a/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_snapshot[one row].png b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_snapshot[one row].png new file mode 100644 index 000000000..adaabf424 Binary files /dev/null and b/tests/safeds/data/tabular/containers/_column/__snapshots__/test_plot_violin_plot/test_should_match_snapshot[one row].png differ diff --git a/tests/safeds/data/tabular/containers/_column/test_plot_violin_plot.py b/tests/safeds/data/tabular/containers/_column/test_plot_violin_plot.py new file mode 100644 index 000000000..e3dabb212 --- /dev/null +++ b/tests/safeds/data/tabular/containers/_column/test_plot_violin_plot.py @@ -0,0 +1,46 @@ +import pytest +from safeds.data.tabular.containers import Column +from safeds.exceptions import ColumnTypeError +from syrupy import SnapshotAssertion + + +@pytest.mark.parametrize( + "column", + [ + Column("a", []), + Column("a", [0]), + Column("a", [0, 1]), + ], + ids=[ + "empty", + "one row", + "multiple rows", + ], +) +def test_should_match_snapshot(column: Column, snapshot_png_image: SnapshotAssertion) -> None: + violin_plot = column.plot.violin_plot() + assert violin_plot == snapshot_png_image + + +@pytest.mark.parametrize( + "column", + [ + Column("a", []), + Column("a", [0]), + Column("a", [0, 1]), + ], + ids=[ + "empty", + "one row", + "multiple rows", + ], +) +def test_should_match_dark_snapshot(column: Column, snapshot_png_image: SnapshotAssertion) -> None: + violin_plot = column.plot.violin_plot(theme="dark") + assert violin_plot == snapshot_png_image + + +def test_should_raise_if_column_contains_non_numerical_values() -> None: + column = Column("a", ["A", "B", "C"]) + with pytest.raises(ColumnTypeError): + column.plot.violin_plot() diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_dark_snapshot[four columns (all numeric)].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_dark_snapshot[four columns (all numeric)].png new file mode 100644 index 000000000..6a53a4db0 Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_dark_snapshot[four columns (all numeric)].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_dark_snapshot[four columns (some non-numeric)].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_dark_snapshot[four columns (some non-numeric)].png new file mode 100644 index 000000000..c8d31170f Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_dark_snapshot[four columns (some non-numeric)].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_dark_snapshot[one column].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_dark_snapshot[one column].png new file mode 100644 index 000000000..977583dbb Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_dark_snapshot[one column].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_snapshot[four columns (all numeric)].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_snapshot[four columns (all numeric)].png new file mode 100644 index 000000000..fb87951ef Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_snapshot[four columns (all numeric)].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_snapshot[four columns (some non-numeric)].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_snapshot[four columns (some non-numeric)].png new file mode 100644 index 000000000..7f73a81ac Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_snapshot[four columns (some non-numeric)].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_snapshot[one column].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_snapshot[one column].png new file mode 100644 index 000000000..ecf84738b Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violin_plots/test_should_match_snapshot[one column].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_dark_snapshot[four columns (all numeric)].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_dark_snapshot[four columns (all numeric)].png new file mode 100644 index 000000000..6a53a4db0 Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_dark_snapshot[four columns (all numeric)].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_dark_snapshot[four columns (some non-numeric)].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_dark_snapshot[four columns (some non-numeric)].png new file mode 100644 index 000000000..c8d31170f Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_dark_snapshot[four columns (some non-numeric)].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_dark_snapshot[one column].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_dark_snapshot[one column].png new file mode 100644 index 000000000..977583dbb Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_dark_snapshot[one column].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_snapshot[four columns (all numeric)].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_snapshot[four columns (all numeric)].png new file mode 100644 index 000000000..fb87951ef Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_snapshot[four columns (all numeric)].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_snapshot[four columns (some non-numeric)].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_snapshot[four columns (some non-numeric)].png new file mode 100644 index 000000000..7f73a81ac Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_snapshot[four columns (some non-numeric)].png differ diff --git a/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_snapshot[one column].png b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_snapshot[one column].png new file mode 100644 index 000000000..ecf84738b Binary files /dev/null and b/tests/safeds/data/tabular/plotting/__snapshots__/test_plot_violinplots/test_should_match_snapshot[one column].png differ diff --git a/tests/safeds/data/tabular/plotting/test_plot_violin_plots.py b/tests/safeds/data/tabular/plotting/test_plot_violin_plots.py new file mode 100644 index 000000000..d2da0fd93 --- /dev/null +++ b/tests/safeds/data/tabular/plotting/test_plot_violin_plots.py @@ -0,0 +1,49 @@ +import pytest +from safeds.data.tabular.containers import Table +from safeds.exceptions import NonNumericColumnError +from syrupy import SnapshotAssertion + + +@pytest.mark.parametrize( + "table", + [ + Table({"A": [1, 2, 3]}), + Table({"A": [1, 2, 3], "B": ["A", "A", "Bla"], "C": [True, True, False], "D": [1.0, 2.1, 4.5]}), + Table({"A": [1, 2, 3], "B": [1.0, 2.1, 4.5], "C": [1, 2, 3], "D": [1.0, 2.1, 4.5]}), + ], + ids=["one column", "four columns (some non-numeric)", "four columns (all numeric)"], +) +def test_should_match_snapshot(table: Table, snapshot_png_image: SnapshotAssertion) -> None: + violinplots = table.plot.violin_plots() + assert violinplots == snapshot_png_image + + +@pytest.mark.parametrize( + "table", + [ + Table({"A": [1, 2, 3]}), + Table({"A": [1, 2, 3], "B": ["A", "A", "Bla"], "C": [True, True, False], "D": [1.0, 2.1, 4.5]}), + Table({"A": [1, 2, 3], "B": [1.0, 2.1, 4.5], "C": [1, 2, 3], "D": [1.0, 2.1, 4.5]}), + ], + ids=["one column", "four columns (some non-numeric)", "four columns (all numeric)"], +) +def test_should_match_dark_snapshot(table: Table, snapshot_png_image: SnapshotAssertion) -> None: + violinplots = table.plot.violin_plots(theme="dark") + assert violinplots == snapshot_png_image + + +def test_should_raise_if_column_contains_non_numerical_values() -> None: + table = Table.from_dict({"A": ["1", "2", "3.5"], "B": ["0.2", "4", "77"]}) + with pytest.raises( + NonNumericColumnError, + match=( + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThis table contains only" + r" non-numerical columns." + ), + ): + table.plot.violin_plots() + + +def test_should_fail_on_empty_table() -> None: + with pytest.raises(NonNumericColumnError): + Table().plot.violin_plots()