gpt4 book ai didi

python - 如何在seaborn stripplot中设置抖动种子?

转载 作者:行者123 更新时间:2023-12-04 09:54:39 24 4
gpt4 key购买 nike

我正在尝试准确地复制带状图,以便我可以可靠地绘制线条并在其上书写。但是,当我生成带有抖动的带状图时,抖动是随机的,并且会阻止我实现目标。

我盲目尝试了一些rcParams我在其他 Stack Overflow 帖子中找到,例如 mpl.rcParams['svg.hashsalt']这没有用。我还尝试为 random.seed() 设置种子没有成功。

我正在运行的代码如下所示。

import seaborn as sns
import matplotlib.pyplot as plt
import random

plt.figure(figsize=(14,9))

random.seed(123)

catagories = []
values = []

for i in range(0,200):
n = random.randint(1,3)
catagories.append(n)

for i in range(0,200):
n = random.randint(1,100)
values.append(n)

sns.stripplot(catagories, values, size=5)
plt.title('Random Jitter')
plt.xticks([0,1,2],[1,2,3])
plt.show()

此代码生成 stripplot就像我想要的那样。但是,如果您运行代码两次,由于抖动,您将获得不同的点位置。我制作的图表需要抖动才能看起来不荒谬,但我想在图表上写字。然而,在运行代码之前无法知道点的确切位置,每次运行代码时都会改变。

有什么方法可以为seaborn中的抖动设置种子 stripplots使它们完全可复制?

最佳答案

  • 抖动由 scipy.stats.uniform 决定
  • uniformclass uniform_gen(scipy.stats._distn_infrastructure.rv_continuous)
  • 这是class rv_continuous(rv_generic)的子类
  • 其中有seed参数,并使用 np.random
  • 因此,使用 np.random.seed()
  • 需要在每个绘图之前调用它。在示例的情况下,np.random.seed(123)必须在循环内。

  • 来自 Stripplot 文档字符串

    jitter : float, ``True``/``1`` is special-cased, optional
    Amount of jitter (only along the categorical axis) to apply. This
    can be useful when you have many points and they overlap, so that
    it is easier to see the distribution. You can specify the amount
    of jitter (half the width of the uniform random variable support),
    or just use ``True`` for a good default.

    来自 class _StripPlottercategorical.py
  • 抖动使用 scipy.stats.uniform 计算

  • from scipy import stats

    class _StripPlotter(_CategoricalScatterPlotter):
    """1-d scatterplot with categorical organization."""
    def __init__(self, x, y, hue, data, order, hue_order,
    jitter, dodge, orient, color, palette):
    """Initialize the plotter."""
    self.establish_variables(x, y, hue, data, orient, order, hue_order)
    self.establish_colors(color, palette, 1)

    # Set object attributes
    self.dodge = dodge
    self.width = .8

    if jitter == 1: # Use a good default for `jitter = True`
    jlim = 0.1
    else:
    jlim = float(jitter)
    if self.hue_names is not None and dodge:
    jlim /= len(self.hue_names)
    self.jitterer = stats.uniform(-jlim, jlim * 2).rvs

    来自 rv_continuous 文档字符串

        seed : {None, int, `~np.random.RandomState`, `~np.random.Generator`}, optional
    This parameter defines the object to use for drawing random variates.
    If `seed` is `None` the `~np.random.RandomState` singleton is used.
    If `seed` is an int, a new ``RandomState`` instance is used, seeded
    with seed.
    If `seed` is already a ``RandomState`` or ``Generator`` instance,
    then that object is used.
    Default is None.

    将您的代码与 np.random.seed 一起使用
  • 所有的情节点都相同

  • import seaborn as sns
    import matplotlib.pyplot as plt
    import numpy as np

    fig, axes = plt.subplots(2, 3, figsize=(12, 12))
    for x in range(6):

    np.random.seed(123)

    catagories = []
    values = []

    for i in range(0,200):
    n = np.random.randint(1,3)
    catagories.append(n)

    for i in range(0,200):
    n = np.random.randint(1,100)
    values.append(n)

    row = x // 3
    col = x % 3
    axcurr = axes[row, col]

    sns.stripplot(catagories, values, size=5, ax=axcurr)
    axcurr.set_title(f'np.random jitter {x+1}')
    plt.show()

    enter image description here

    仅使用 random
  • 情节点四处移动

  • import seaborn as sns
    import matplotlib.pyplot as plt
    import random

    fig, axes = plt.subplots(2, 3, figsize=(12, 12))
    for x in range(6):

    random.seed(123)

    catagories = []
    values = []

    for i in range(0,200):
    n = random.randint(1,3)
    catagories.append(n)

    for i in range(0,200):
    n = random.randint(1,100)
    values.append(n)

    row = x // 3
    col = x % 3
    axcurr = axes[row, col]

    sns.stripplot(catagories, values, size=5, ax=axcurr)
    axcurr.set_title(f'random jitter {x+1}')
    plt.show()

    enter image description here

    使用 random用于数据和 np.random.seed为了情节

    fig, axes = plt.subplots(2, 3, figsize=(12, 12))
    for x in range(6):

    random.seed(123)

    catagories = []
    values = []

    for i in range(0,200):
    n = random.randint(1,3)
    catagories.append(n)

    for i in range(0,200):
    n = random.randint(1,100)
    values.append(n)

    row = x // 3
    col = x % 3
    axcurr = axes[row, col]

    np.random.seed(123)
    sns.stripplot(catagories, values, size=5, ax=axcurr)
    axcurr.set_title(f'np.random jitter {x+1}')
    plt.show()

    enter image description here

    关于python - 如何在seaborn stripplot中设置抖动种子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61944815/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com