繁体   English   中英

Matplotlib / Seaborn shareX为具有字符串x轴值的所有子图创建错误的x标签

[英]Matplotlib/Seaborn shareX creates wrong x-labels for all subplots with string x-axis values

我正在使用for循环创建子图图,当我打开“ sharex”时,所有子图的x标签都不正确,并且与最后一个子图匹配。 我希望它为每个可用标签创建一个刻度。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


df = pd.DataFrame({
     'letters' : ['A','A','A', 'B','B','B', 'C','C','C', 'D','D','D'],
     'values' : [1, 2, 3, 3, 2, 1, 2, 3, 1, 2, 3, 4],
     'options': ['O 1', 'O 2', 'O 3', 'O 3', 'O 2', 'O 1',
                 'O 2','O 3','O 1','O 2','O 3','O 4'],
                 })

list_letters = ['A', 'B', 'C', 'D']

fig,axes = plt.subplots(nrows = 1, ncols = len(list_letters), sharey = True, sharex = True)
for letter in list_letters:
    index = list_letters.index(letter)
    df2 = df[(df['letters'] == letter)]
    sns.scatterplot(x="options", y="values",data = df2,
              hue = 'options', ax=axes[index], legend = False)

    axes[index].set_title(letter, rotation = 60, verticalalignment = 'bottom', ha = 'left')

我专门制作了数据框,因此选项O1的所有“字母”值为1。 O2,O3和O4相同。

在shareX关闭的情况下(False):
关闭shareX

启用shareX时(真):
启用shareX

请注意,值如何与选项不正确对应,只有3个标签,并且关闭shareX时,所有子图都与最后一个子图顺序匹配。

这是字符串x轴的问题。 如果我将“选项”列更改为数值,则一切正常。 看这里:
x轴整数值

是否有任何方法可以通过for循环创建子图,打开ShareX并具有四个标签O1,O2,O3,O4,并且所有值都正确对齐?

不幸的是,目前尚无法确定轴的单位。 这使得绘制多个分类数据集变得麻烦。
一种有针对性的解决方法是按预期顺序在轴上绘制一些东西,然后再将其删除。 这是通过以下代码中的prepare_axes函数完成的。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
     'letters' : ['A','A','A', 'B','B','B', 'C','C','C', 'D','D','D'],
     'values' : [1, 2, 3, 3, 2, 1, 2, 3, 1, 2, 3, 4],
     'options': ['O 1', 'O 2', 'O 3', 'O 3', 'O 2', 'O 1',
                 'O 2','O 3','O 1','O 2','O 3','O 4'],
                 })

list_letters = ['A', 'B', 'C', 'D']

def prepare_axes(x, ax):
    ax.autoscale(False)
    line, = ax.plot(x, np.zeros(len(x)))
    line.remove()
    ax.relim()
    ax.autoscale(True)

# determine all needed categoricals        
uniqueoptions = df["options"].unique()

fig,axes = plt.subplots(nrows = 1, ncols = len(list_letters), sharey = True, sharex = True)
for letter in list_letters:
    index = list_letters.index(letter)
    df2 = df[(df['letters'] == letter)]
    _, hue = np.unique(df2["options"].values, return_inverse=True)
    prepare_axes(uniqueoptions, axes[index])
    axes[index].scatter(x="options", y="values", c=hue, data = df2)

    axes[index].set_title(letter, rotation = 60, verticalalignment = 'bottom', ha = 'left')

plt.show()

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM