Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to control width of graph line in matplotlib?

I am trying to plot line graphs in matplotlib with the following data, x,y points belonging to same id is one line, so there are 3 lines in the below df.

      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

It can be simply plotted with following code:

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()

But, I have another data frame df2 where weight of each id is given, and I am hoping to find a way to control the thickness of each line according to it's weight, the larger the weight, thicker is the line. How can I do this? Also what relation will be followed between the weight and width of the line ?

  id     weight
0  1          5
1  2         15
2  3          2

Please let me know if anything is unclear.

like image 399
abcdef Avatar asked Aug 23 '17 18:08

abcdef


People also ask

How do you change the width of a line in Matplotlib?

Import the various modules and libraries you need for the plot: matplot library matplot , numpy , pyplot . Create your data set(s) to be plotted. In the plot() method after declaring the linewidth parameter, you assign it to any number value you want to represent the desired width of your plot.


1 Answers

Based on the comments, you need to know a few things:

How to set the line width?

That's simple: linewidth=number. See https://matplotlib.org/examples/pylab_examples/set_and_get.html

How to take the weight and make it a significant width?

This depends on the range of your weight. If it's consistently between 2 and 15, I'd recommend simply dividing it by 2, i.e.:

linewidth=weight/2

If you find this aesthetically unpleasing, divide by a bigger number, though that would obviously reduce the number of linewidths you get.

How to get the weight out of df2?

Given the df2 you described and the code you showed, key is the id of df2. So you want:

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

Putting it all together:

Replace your grp.plot line with the following:

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

(All this is is your line with the entry for linewidth added in.)

like image 78
Scott Mermelstein Avatar answered Oct 20 '22 01:10

Scott Mermelstein