1

I am a beginner with Pandas and Matplotlib and I have some questions about formatting plots when using pandas. I have the following code for an area plot:

import pandas as pd
from matplotlib import pyplot as plt

ax= wind_data.plot.area()
plt.legend(loc='center left', bbox_to_anchor= (1.0, 0.5))
plt.grid(False)
ax.set_facecolor("white")
ax.set_xlabel("Time of day")
ax.set_ylabel("Power in kW")
ax.set_xlim(0,24)
ax.set_ylim(0,50)

Now I want to change the following aspects:

  • The values on the x axis are times of the day. They should be displayed beginning from 00:00 - 24:00. So for every hour there should be an entry. The entries should be written vertically (not horizontally) due to lack of space
  • When I export the png-file there is a grey box around the plot. This should not be the case. Instead there should be a thin black line that serves as the rim
  • I would like to have some horizontal line at every entry of the y-axis. This line should not be so strong but rather somehow transparent such that you can see it, without being dominant.

Is it possible to do this with Matplotlib(or any other library for python)?

EDIT: Here you have the input data:

Building 1  Building 2  Building 3  Building 4  Building 5
7.04    7.04    7.04    7.04    7.04
6.36    6.36    6.36    6.36    6.36
6.4     6.4     6.4     6.4     6.4
6.1     6.1     6.1     6.1     6.1
5.88    5.88    5.88    5.88    5.88
6.18    6.18    6.18    6.18    6.18
6.16    6.16    6.16    6.16    6.16
5.82    5.82    5.82    5.82    5.82
5.28    5.28    5.28    5.28    5.28
4.82    4.82    4.82    4.82    4.82
4.18    4.18    4.18    4.18    4.18
4.02    4.02    4.02    4.02    4.02
4.08    4.08    4.08    4.08    4.08
4.24    4.24    4.24    4.24    4.24
6.24    6.24    6.24    6.24    6.24
8.44    8.44    8.44    8.44    8.44
8.72    8.72    8.72    8.72    8.72
8.06    8.06    8.06    8.06    8.06
7.16    7.16    7.16    7.16    7.16
6.52    6.52    6.52    6.52    6.52
7.16    7.16    7.16    7.16    7.16
7.88    7.88    7.88    7.88    7.88
8.44    8.44    8.44    8.44    8.44
8.56    8.56    8.56    8.56    8.56

EDIT: Error message when using JohanC's solution code in Jupyter

AttributeError                            Traceback (most recent call last)
<ipython-input-5-51251d64e3e0> in <module>()
     21 ax.set_xlim(1, 24)
     22 ax.set_ylim(0, 50)
---> 23 plt.xticks(wind_data.index, labels=[f'{h:02d}:00' for h in wind_data.index], rotation=90)
     24 plt.grid(axis='y', alpha=.4)
     25 plt.tight_layout()

C:\Users\wi9632\AppData\Local\Continuum\Anaconda3\lib\site-packages\matplotlib\pyplot.py in xticks(*args, **kwargs)
   1704     if len(kwargs):
   1705         for l in labels:
-> 1706             l.update(kwargs)
   1707 
   1708     return locs, silent_list('Text xticklabel', labels)

C:\Users\wi9632\AppData\Local\Continuum\Anaconda3\lib\site-packages\matplotlib\text.py in update(self, kwargs)
    241         """
    242         bbox = kwargs.pop('bbox', None)
--> 243         super(Text, self).update(kwargs)
    244         if bbox:
    245             self.set_bbox(bbox)  # depends on font properties

C:\Users\wi9632\AppData\Local\Continuum\Anaconda3\lib\site-packages\matplotlib\artist.py in update(self, props)
    883         try:
    884             ret = [_update_property(self, k, v)
--> 885                    for k, v in props.items()]
    886         finally:
    887             self.eventson = store

C:\Users\wi9632\AppData\Local\Continuum\Anaconda3\lib\site-packages\matplotlib\artist.py in <listcomp>(.0)
    883         try:
    884             ret = [_update_property(self, k, v)
--> 885                    for k, v in props.items()]
    886         finally:
    887             self.eventson = store

C:\Users\wi9632\AppData\Local\Continuum\Anaconda3\lib\site-packages\matplotlib\artist.py in _update_property(self, k, v)
    876                 func = getattr(self, 'set_' + k, None)
    877                 if func is None or not six.callable(func):
--> 878                     raise AttributeError('Unknown property %s' % k)
    879                 return func(v)
    880 

AttributeError: Unknown property labels
3
  • These formatting issues are actually about matplotlib (the package Pandas uses for plotting) and not Pandas. Searching for these things with "matplotlib" added should get you closer to an answer. Commented Jan 1, 2020 at 12:11
  • 1
    Can you share some data? it's hard to know what you are plotting Commented Jan 1, 2020 at 17:19
  • @CodeDifferent: I just did that Commented Jan 2, 2020 at 9:58

1 Answer 1

1

Here is an example using matplotlib. Now with the data from the updated question.

For the xticks, the tick positions and labels can be set with plt.xticks()``, which also accepts a rotation angle. To get a black border, it seems the linewidth needs to be set via plt.figure, while the edgecolor is a parameter to plt.savefig.

plt.grid has parameters to show grid lines in one or both directions. An alpha value can be set to make these lines less or more prominent.

import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline

columns = ['Building 1', 'Building 2', 'Building 3', 'Building 4', 'Building 5']
power_values = [[7.04, 7.04, 7.04, 7.04, 7.04], [6.36, 6.36, 6.36, 6.36, 6.36], [6.4, 6.4, 6.4, 6.4, 6.4],
                [6.1, 6.1, 6.1, 6.1, 6.1], [5.88, 5.88, 5.88, 5.88, 5.88], [6.18, 6.18, 6.18, 6.18, 6.18],
                [6.16, 6.16, 6.16, 6.16, 6.16], [5.82, 5.82, 5.82, 5.82, 5.82], [5.28, 5.28, 5.28, 5.28, 5.28],
                [4.82, 4.82, 4.82, 4.82, 4.82], [4.18, 4.18, 4.18, 4.18, 4.18], [4.02, 4.02, 4.02, 4.02, 4.02],
                [4.08, 4.08, 4.08, 4.08, 4.08], [4.24, 4.24, 4.24, 4.24, 4.24], [6.24, 6.24, 6.24, 6.24, 6.24],
                [8.44, 8.44, 8.44, 8.44, 8.44], [8.72, 8.72, 8.72, 8.72, 8.72], [8.06, 8.06, 8.06, 8.06, 8.06],
                [7.16, 7.16, 7.16, 7.16, 7.16], [6.52, 6.52, 6.52, 6.52, 6.52], [7.16, 7.16, 7.16, 7.16, 7.16],
                [7.88, 7.88, 7.88, 7.88, 7.88], [8.44, 8.44, 8.44, 8.44, 8.44], [8.56, 8.56, 8.56, 8.56, 8.56]]
wind_data = pd.DataFrame(power_values, index=range(1, 25), columns=columns)
fig = plt.figure(linewidth=1, figsize=(7, 5))
ax = wind_data.plot.area(ax=plt.gca(), color=plt.get_cmap('Set1').colors)
plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))
ax.set_facecolor("white")
ax.set_xlabel("Time of day")
ax.set_ylabel("Power in kW")
ax.set_xlim(1, 24)
ax.set_ylim(0, 50)
plt.xticks(wind_data.index, labels=[f'{h:02d}:00' for h in wind_data.index], rotation=90)
plt.grid(axis='y', alpha=.4)
plt.tight_layout()
plt.savefig('wind_data.png', edgecolor='black', dpi=300)
plt.show()

example plot

PS: If your Python version is older than 3.6, replace f'{h:02d}:00' by '%02d:00' % h.

Sign up to request clarification or add additional context in comments.

10 Comments

Thanks Johan for your answer. Unfortunately I get many errors when I use your posted code with Jupyter. I edited the original post and added the input data. Maybe this helps you.
To me it works just fine, also inside a notebook. I updated the code with your new data, so I needed 24 instead of 25 values. Please add the error messages to the question if you still encounter problems.
This seems to indicate you have a quite old version of matplotlib (older than 1.5, current version is 3.1.1). Could you try to upgrade? Apart from that, I'm using f-strings, something new in Python 3.6 to easily integrate numbers into strings.
If your files are organized as csv, you could call wind_data = pd.read_csv("filename.csv") . See docs or this post. There is something similar to read Excel files provided the files are structured as a header line and values.
"plt" is the library. "fig" is a variable to represent one division in a plot. "ax" is another variable that mainly controls how the screen-x-y is mapped to x and y coordinates. See stackoverflow.com/questions/37970424/… There is also plt.gca() to "get the current axes" and plt.gcf() to "get the current figure". Often plt.something gets converted internally to plt.gca().something. So, there is a lot of overlap and it is not always easy to know which functionality is where.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.