matplotlib - 为小提琴情节制作标签

时间:2015-11-23 06:01:35

标签: python matplotlib label

我通常使用参数'标签'以下列方式为条形图制作标签。在方法' bar'。

axes[0].bar(x, y, bar_width, label='abc')
axes[0].legend()

现在我想绘制小提琴情节并为每个系列制作如下标签,但由于小提琴情节'没有参数'标签'。

axes[0].violinplot(data1, label='abc1')
axes[1].violinplot(data2, label='abc2')

任何人都可以帮我为每个系列制作标签吗?

5 个答案:

答案 0 :(得分:5)

正如评论中提到的,matplotlib中的一些情节并不支持传说。文档仍然提供了一种为其添加自定义图例的简单方法:http://matplotlib.org/users/legend_guide.html#proxy-legend-handles

主要想法:添加'假冒'对象,可以不在图中显示,然后用它来形成图例方法的句柄列表。

    import random
    import numpy as np
    import matplotlib.pyplot as pl
    import matplotlib.patches as mpatches
    from itertools import repeat

    red_patch = mpatches.Patch(color='red')
    # 'fake' invisible object

    pos   = [1, 2, 4, 5, 7, 8]
    label = ['plot 1','plot2','ghi','jkl','mno','pqr']
    data  = [np.random.normal(size=100) for i in pos]

    fake_handles = repeat(red_patch, len(pos))

    pl.figure()
    ax = pl.subplot(111)
    pl.violinplot(data, pos, vert=False)
    ax.legend(fake_handles, label)
    pl.show()

violinplot with custom legend

答案 1 :(得分:3)

编辑:对不起,我现在看到你想添加一个图例,而不是轴标签......

您可以手动设置刻度线位置,然后覆盖其标签:

import numpy as np
import matplotlib.pyplot as pl

pos   = [1, 2, 4, 5, 7, 8]
label = ['abc','def','ghi','jkl','mno','pqr']
data  = [np.random.normal(size=100) for i in pos]

pl.figure()
ax = pl.subplot(111)
pl.violinplot(data, pos, vert=False)
ax.set_yticks(pos)
ax.set_yticklabels(label)

enter image description here

答案 2 :(得分:2)

这是我的多种小提琴乐谱的解决方案。请注意,它从给定的小提琴图的第一个阴影区域中获取色块颜色-如果存在多种颜色,可以将其更改为其他颜色,或者可以使用{{1}来获取垂直条的颜色}。

violin["cbars"].get_color().flatten()

enter image description here

答案 3 :(得分:2)

有一个比@Ian Hincks代码更简单的解决方案,而无需使用mpatches

import matplotlib.pyplot as plt
import numpy as np

positions = np.arange(3,13,3)
data = np.random.randn(1000, len(positions))
vp1 = plt.violinplot(data, positions) 

positions = np.arange(1, 10, 2)
data = np.random.randn(1000, len(positions)) + positions
vp2 = plt.violinplot(data, positions)

positions = np.arange(2, 11, 1)
data = np.random.randn(1000, len(positions)) + positions ** 2 / 4
vp3 = plt.violinplot(data, positions)

plt.legend([vp1['bodies'][0],vp2['bodies'][0], vp3['bodies'][0]], ['flat', 'linear', 'quadratic'], loc=2)[enter image description here][1]

要使用行而不是正文,请用vp1['bodies'][0]替换vp1['cbars']

演示:violin plot with labels

答案 4 :(得分:1)

更简洁明了的解决方案可以是:

plt.style.use('seaborn')
import matplotlib.pyplot as plt
labels = ['df=9' , 'df=99', 'df=999', 'df=9999', 'N($\mu=0$, $\sigma=2)$']
colors = ['orange', 'lightblue', 'lightgreen', 'yellow', 'green']
def make_violinplot(x, labels, colors):
    parts = plt.violinplot(x, showmeans=True, showmedians=True)
    for body, color in zip(parts['bodies'],colors):
        body.set_facecolor(color)
        parts['cmeans'].set_color('red')
        parts['cmedians'].set_color('blue')
    plt.legend(label[enter image description here][1]s, loc='upper left')
    plt.xticks(np.arange(1, len(labels)+1), labels)
    plt.title("probability density plots t- vs normal distribution")
    plt.rcParams["figure.figsize"] = [8,8]
    return
make_violinplot(t_dists, labels, colors)