plt.violinplot: настройка длины горизонтальных минимальных и максимальных строк

#python #matplotlib #violin-plot

#python #matplotlib #violin-plot

Вопрос:

Я создал violinplot с помощью matplotlib. Теперь я хотел бы уменьшить горизонтальную длину двух строк для минимального и максимального значений. Как я могу это сделать?

Вот мой код. Код сокращен до необходимой информации для лучшего обзора.

 # Initialize
import matplotlib.pyplot as plt
import numpy as np
import statistics


# Creation of violinplots
Core_values = np.loadtxt("pathtofile/xyz.txt", comments=None, delimiter=None, converters=None, skiprows=0, usecols=0,
                  unpack=False, ndmin=0, encoding=None, max_rows=None, like=None)

Core = plt.violinplot(Core_values, positions=[0], points=500)


# Look of the violinplot
for vp in Core["bodies"]:
    vp.set_facecolor("cornflowerblue")
    vp.set_zorder(2)
    vp.set_alpha(1)
    vp.set_linewidth(1)

for vp_part in ("cbars", "cmins", "cmaxes"):
    vp = Core[vp_part]
    vp.set_edgecolor("black")

plt.show()
 

На скриншоте ниже показано, что я имею в виду: верхняя и нижняя черные линии violinplot. Я хотел бы уменьшить их горизонтальную длину.

введите описание изображения здесь

Ответ №1:

В руководстве Matplotlib предлагается вычислять и рисовать линии на отдельном шаге.

Вот альтернативный подход, перебирающий сгенерированные строки и уменьшающий их длину (до 40% в примере кода):

 import matplotlib.pyplot as plt
import numpy as np

np.random.seed(123)
core_values = [np.random.normal(.1, 3, 10000).cumsum(), np.random.normal(.1, 2, 10000).cumsum()]

core = plt.violinplot(core_values, positions=[0, 1])

for vp in core["bodies"]:
    vp.set_facecolor("cornflowerblue")
    vp.set_zorder(2)
    vp.set_alpha(1)
    vp.set_linewidth(1)

factor_x, factor_y = 0.4, 1 # factor to reduce the lengths
for vp_part in ("cbars", "cmaxes", "cmins"):
    vp = core[vp_part]
    if vp_part in ("cmaxes", "cmins"):
        lines = vp.get_segments()
        new_lines = []
        for line in lines:
            center = line.mean(axis=0)
            line = (line - center) * np.array([factor_x, factor_y])   center
            new_lines.append(line)
        vp.set_segments(new_lines)
    vp.set_edgecolor("black")

plt.show()
 

plt.violinplot с отрегулированными крайними значениями