Python中的多个饼图尺寸错误

时间:2019-01-10 13:22:04

标签: python matplotlib

我在python中有字典:

dict = {1: {'A': 11472, 'C': 8405, 'T': 11428, 'G': 6613}, 2: {'A': 11678, 'C': 9388, 'T': 10262, 'G': 6590}, 3: {'A': 2945, 'C': 25843, 'T': 6980, 'G': 2150}, 4: {'A': 1149, 'C': 24552, 'T': 7000, 'G': 5217}, 5: {'A': 27373, 'C': 3166, 'T': 4494, 'G': 2885}, 6: {'A': 19300, 'C': 4252, 'T': 7510, 'G': 6856}, 7: {'A': 17744, 'C': 5390, 'T': 7472, 'G': 7312}}

此词典有7个小词典,每个小词典有4个条目。我试图在同一图中制作7个饼图(多个图),每个坑图将有4个部分。使用以下函数来绘制我正在绘制的数据。

def plot(array):
    array = np.array([list(val.values()) for val in dict.values()])
    df = pd.DataFrame(array, index=['a', 'b', 'c', 'd'], columns=['x', 'y','z','w', 'd', 't', 'u'])
    plt.style.use('ggplot')
    colors = plt.rcParams['axes.color_cycle']
    fig, axes = plt.subplots(1,4, figsize=(10,5))
    for ax, col in zip(axes, df.columns):
        ax.pie(df[col], labels=df.index, autopct='%.2f', colors=colors)
        ax.set(ylabel='', title=col, aspect='equal')
    axes[0].legend(bbox_to_anchor=(0, 0.5))
    fig.savefig('plot.pdf')
    plt.show()

但是此函数返回一个带有4个饼图的图形,每个饼图都有7个部分。并且如果我替换“ index”和“ columns”,我将得到以下error

ValueError: Shape of passed values is (4, 7), indices imply (7, 4)

您知道我该如何解决吗?这是我将得到但不正确的数字。

enter image description here

1 个答案:

答案 0 :(得分:0)

有两个问题:

  • 您需要7个子图,但您仅使用plt.subplots(1,4)创建了4个。您应该将(1,7)定义为具有7个子图。

  • 您需要相应地重塑数据。由于您需要7个饼图,每个饼图都有4个条目,因此您需要调整数组的形状以使其形状为(4, 7)

PS:我使用的是matplotlib 2.2.2,其中'axes.color_cycle'已贬值。

下面是修改后的plot函数。


def plot():
    array = np.array([list(val.values()) for val in dict.values()]).reshape((4, 7))
    df = pd.DataFrame(array, index=['a', 'b', 'c', 'd'], columns=['x', 'y','z','w', 'd', 't', 'u'])
    plt.style.use('ggplot')
    colors = plt.rcParams['axes.color_cycle']
    fig, axes = plt.subplots(1,7, figsize=(12,8))
    for ax, col in zip(axes, df.columns):
        ax.pie(df[col], labels=df.index, autopct='%.2f', colors=colors)
        ax.set(ylabel='', title=col, aspect='equal')
    axes[0].legend(bbox_to_anchor=(0, 0.5))

enter image description here