当前位置: 首页 > 知识库问答 >
问题:

如何在matplotlib中按不同组绘制直方图?

申黎明
2023-03-14

我有一张桌子,比如:

value    type
10       0
12       1
13       1
14       2

生成虚拟数据:

import numpy as np

value = np.random.randint(1, 20, 10)
type = np.random.choice([0, 1, 2], 10)

我想用垫线 (v1.4) 在 Python 3 中完成一个任务:

  • 绘制value
  • 的直方图
  • 类型分组,即使用不同的颜色区分类型
  • “栏”的位置应为“闪避”,即并排
  • 因为值的范围很小,所以我会使用标识作为箱子,即箱子的宽度为1

问题是:

  • 如何根据type的值为条形图分配颜色并从颜色映射中绘制颜色(例如Accent或matplotlib中的其他cmap)?我不想使用命名颜色(即'b'、'k'、'r'
  • 我的直方图中的条形相互重叠,如何“躲闪”条形?

注意事项

  1. 我试过Seaborn、matplotlib和熊猫。绘制两个小时,未能获得所需的直方图
  2. 我阅读了matplotlib的示例和用户指南。令人惊讶的是,我没有找到关于如何从颜色图中指定颜色的教程
  3. 我在谷歌上搜索过,但没有找到一个简洁的例子
  4. 我想一个人可以用matplotlib完成任务。pyplot,不导入一系列模块,例如matplotlib。cmmatplotlib.colors

共有2个答案

苍意智
2023-03-14

每当您需要绘制由另一个变量分组的变量(使用颜色)时,seborn通常提供比matplotlib或熊猫更方便的方法。所以这里有一个使用sebornhistplop函数的解决方案:

import numpy as np                 # v 1.19.2
import pandas as pd                # v 1.1.3
import matplotlib.pyplot as plt    # v 3.3.2
import seaborn as sns              # v 0.11.0

# Set parameters for random data
rng = np.random.default_rng(seed=1) # random number generator
size = 50
xmin = 1
xmax = 20

# Create random dataframe
df = pd.DataFrame(dict(value = rng.integers(xmin, xmax, size=size),
                       val_type = rng.choice([0, 1, 2], size=size)))

# Create histogram with discrete bins (bin width is 1), colored by type
fig, ax = plt.subplots(figsize=(10,4))
sns.histplot(data=df, x='value', hue='val_type', multiple='dodge', discrete=True,
             edgecolor='white', palette=plt.cm.Accent, alpha=1)

# Create x ticks covering the range of all integer values of df['value']
ax.set_xticks(np.arange(df['value'].min(), df['value'].max()+1))

# Additional formatting
sns.despine()
ax.get_legend().set_frame_on(False)

plt.show()

如您所见,这是直方图而不是条形图,条形图之间没有空格,除非数据集中不存在 x 轴的值,例如值 12 和 14。

鉴于已接受的答案提供了熊猫的条形图,并且条形图可能是在某些情况下显示直方图的相关选择,下面是如何使用countplot函数创建一个海生图:

# For some reason the palette argument in countplot is not processed the
# same way as in histplot so here I fetch the colors from the previous
# example to make it easier to compare them
colors = [c for c in set([patch.get_facecolor() for patch in ax.patches])]

# Create bar chart of counts of each value grouped by type
fig, ax = plt.subplots(figsize=(10,4))
sns.countplot(data=df, x='value', hue='val_type', palette=colors,
              saturation=1, edgecolor='white')

# Additional formatting
sns.despine()
ax.get_legend().set_frame_on(False)

plt.show()

由于这是一个条形图,值12和14没有包括在内,这产生了一个有点虚假的图,因为没有为这些值显示空白空间。另一方面,每组条形之间有一些空间,这使得更容易看到每个条形属于什么值。

吕志诚
2023-03-14

对于您的第一个问题,我们可以创建一个等于1的虚拟列,然后通过对该列求和生成计数,按值和类型分组。

对于第二个问题,您可以使用< code>colormap参数将色彩映射表直接传递到< code>plot中:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import seaborn
seaborn.set() #make the plots look pretty

df = pd.DataFrame({'value': value, 'type': type})
df['dummy'] = 1
ag = df.groupby(['value','type']).sum().unstack()
ag.columns = ag.columns.droplevel()

ag.plot(kind = 'bar', colormap = cm.Accent, width = 1)
plt.show()
 类似资料:
  • 我正在使用python中的matplotlib绘制直方图,并希望绘制一条代表数据集平均值的线,以虚线的形式覆盖在直方图上(或者其他颜色也可以)。关于如何在柱状图上画一条线有什么想法吗? 我正在使用plot()命令,但不确定如何绘制垂直线(即,我应该为y轴指定什么值? 谢谢

  • numpy.histogram()函数将输入数组和作为两个参数。 bin数组中的连续元素用作每个bin的边界。 Matplotlib 可以将直方图的数字表示转换为图形。 pyplot子模块的plt()函数将包含数据和数组的数组作为参数,并转换为直方图。

  • 给定一个信号的时间表示图,如何画出相应的时间指标线? 具体来说,给定一个时间索引范围为0到2.6(s)的信号图,我想画垂直红线,指示列表的相应时间索引,我该怎么做?

  • 本文向大家介绍python matplotlib库直方图绘制详解,包括了python matplotlib库直方图绘制详解的使用技巧和注意事项,需要的朋友参考一下 例题:假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据? 一些概念及问题: 把数据分为多少组进行统计 组数要适当,太少会

  • 问题内容: 给定时间表示中的信号图,如何绘制标记相应时间索引的线? 具体来说,给定时间索引范围为0到2.6(s)的信号图,我想绘制垂直红线以指示列表的相应时间索引,我该怎么办? 问题答案: 添加无需覆盖实际高度即可覆盖整个绘图窗口的垂直线的标准方法是 要么 您可以使用许多可用于其他情节命令的关键字(例如,,…)。您可以传递关键字参数,如果愿意,可以传递坐标(例如,将覆盖图的中部)。水平线()和矩形

  • 有没有一种惯用的方法来绘制两个类的特征直方图?在熊猫方面,我基本上想要 在同一个情节中。我可以 但这给了我两个不同的情节。 这似乎是一项常见的任务,因此我认为有一种惯用的方法来完成这项任务。当然,我可以手动操作柱状图,使其彼此相邻,但熊猫通常都能很好地做到这一点。 基本上,我希望将这个matplotlib示例放在一行熊猫中:http://matplotlib.org/examples/pylab_