如何在matplotlib中控制图形线条的宽度?

6
我正在尝试在matplotlib中绘制折线图,使用以下数据,x和y点属于同一id是一条线,因此在下面的数据框中有3条线。
      id     x      y
0      1    0.50    0.0
1      1    1.00    0.3
2      1    1.50    0.5
4      1    2.00    0.7
5      2    0.20    0.0
6      2    1.00    0.8
7      2    1.50    1.0
8      2    2.00    1.2
9      2    3.50    2.0
10     3    0.10    0.0
11     3    1.10    0.5
12     3    3.55    2.2

可以使用以下代码简单绘制:
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib notebook

fig, ax = plt.subplots(figsize=(12,8))
cmap = plt.cm.get_cmap("viridis")
groups = df.groupby("id")
ngroups = len(groups)

for i1, (key, grp) in enumerate(groups):
    grp.plot(linestyle="solid", x = "x", y = "y", ax = ax, label = key)

plt.show()

但是,我有另一个数据框df2,其中给出了每个id的权重,并希望找到一种方法来控制每条线的粗细,根据其权重,权重越大,线条越粗。 我该怎么做?此外,线条宽度和权重之间的关系是什么?

  id     weight
0  1          5
1  2         15
2  3          2

如果有任何不清楚的地方,请告诉我。


linewidth="foo",然后探索并确定您要将foo设置为什么。很有可能,您希望将自己的权重缩放到1到7左右 - 超出这个范围就太大了。如何做取决于您的体重范围。 - Scott Mermelstein
1
嗯,我想实际问题不太清楚。你描述了任务,但没有描述问题。你尝试过什么?结果如何?它在哪些方面不起作用?你卡在哪个环节了? - ImportanceOfBeingErnest
@ScottMermelstein 请问你能否举个例子来解释一下,如果我的重量范围在2到15之间,相应的线宽如何取决于它? - abcdef
如果您的重量范围在2到15之间,请尝试使用linewidth=str(weight/2)。这样,您的线宽将从1变化到7.5。 - Scott Mermelstein
@ScottMermelstein 谢谢,但是你能否请示如何在代码中为每个“id”包含“linewidth”。 - abcdef
既然你在谈论数据框架,我猜你正在使用pandas?(我的解决方案就是这样假设的。)如果是这样,我建议你删除matplotlib-widget和numpy,因为它们与此无关,而添加pandas。 - Scott Mermelstein
1个回答

6

根据评论,你需要了解一些事情:

如何设置线宽?

很简单:linewidth=number。请参见https://matplotlib.org/examples/pylab_examples/set_and_get.html

如何将权重加大并使其成为显著的宽度?

这取决于您的权重范围。如果它始终在2到15之间,我建议将其除以2,即:

linewidth=weight/2

如果您发现这个外观不够美观,请将其除以更大的数字,尽管这显然会减少您获得的线宽数量。

如何从 df2 中获取权重?

鉴于您描述的 df2 和您展示的代码,keydf2id。因此,您需要:

df2[df2['id'] == key]['weight']

总结:

将您的grp.plot行替换为以下内容:

grp.plot(linestyle="solid", 
         linewidth=df2[df2['id'] == key]['weight'] / 2.0, 
         x = "x", y = "y", ax = ax, label = key)

(这只是你的代码行,添加了linewidth的输入。)

谢谢,我按照您的建议尝试了,但是它显示了一个关键错误 KeyError: '标签[6]不在[index]中'。 - abcdef
谢谢,虽然它仍然给了我一个错误 ValueError: could not convert string to float,但在删除str()后它可以工作。 - abcdef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接