How do i control the sequence of records in a bar plot with matplotlib with Text?

大城市里の小女人 提交于 2019-12-13 18:20:05

问题


I have a data file that consists of several data points, that i would like to plot in a particular order. Here is the example data file:

cop   94.0528    313     441
cpr   225.172    726     747
ent   444.786    926     939
fsh   256.038    743     754
fsp   43.7764    340     356
pbp   343.708    825     834
rho   426.497    858     886
sca   342.431    427     872

I am currently plotting those just below each other in the way i set the example. How can i change the order of those data records within my python script to a specified order? I already tried to work this into an array. in this question here: How do i control the sequence of records in a bar plot with matplotlib?

So the next question i have from here on out is, can i do the exact same thing, but using a text-based sorting aaray?

So what i would put in would be something like this:

posarray = (crp, 2), (cop,1)

edit: The posarray would denote the position of the record with the text in posarray[0] in the outputarray. The crp would end up at the second position, cop at the first and so on.

and what it would give me would be

cop   94.0528    313     441
cpr   225.172    726     747

the best thing would be using some kind of insert, so that if i forget to mention an item in the sorting array it would sink to the bottom.


回答1:


As described in the answer to your previous question, you can achieve what you want with some indexing trick.

Let's assume that you have a numpy representation of your array as such:

a = array([('cop', 94.0528, 313, 441), ('cpr', 225.172, 726, 747),
           ('ent', 444.786, 926, 939), ('fsh', 256.038, 743, 754),
           ('fsp', 43.7764, 340, 356), ('pbp', 343.708, 825, 834),
           ('rho', 426.497, 858, 886), ('sca', 342.431, 427, 872)], 
          dtype=[('f0', '|S3'), ('f1', '<f8'), ('f2', '<i8'), ('f3', '<i8')])

You can easily get a list of your first column:

>>> fields = list(a['f0'])

Now, define a list of the fields ordered as you want, for example:

>>> new_order = ['cpr', 'cop', 'ent', 'fsh', 'fsp', 'rho', 'pbp', 'sca']

You can get the position of each item of new_order in your fields list by using the index method and some list comprehension:

>>> indices = [fields.index(i) for i in new_order]
[1, 0, 2, 3, 4, 6, 5, 7]

(You can understand why we needed fields to be a list, as an array doesn't have a index method)

That's it. You can now reorder your array with the indices list:

>>> a[indices]
array([('cpr', 225.172, 726, 747), ('cop', 94.0528, 313, 441),
       ('ent', 444.786, 926, 939), ('fsh', 256.038, 743, 754),
       ('fsp', 43.7764, 340, 356), ('rho', 426.497, 858, 886),
       ('pbp', 343.708, 825, 834), ('sca', 342.431, 427, 872)], 
      dtype=[('f0', '|S3'), ('f1', '<f8'), ('f2', '<i8'), ('f3', '<i8')])


来源:https://stackoverflow.com/questions/12039326/how-do-i-control-the-sequence-of-records-in-a-bar-plot-with-matplotlib-with-text

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!