2013-11-24 3 views
2

Я пытаюсь использовать функцию pcolormesh matplotlib для рисования диаграммы, которая показывает точки в 2d координатах, а цвет точек будет определяться числом.Matplotlib Pcolormesh - в каком формате я должен давать данные?

У меня есть три массива, один из которых имеет координаты x, другой с y-координатами, а третий - номера, которые должны представлять цвета.

xdata = [ 695422. 695423. 695424. 695425. 695426. 695426.] 
ydata = [ 0. -15.4 -15.3 -15.7 -15.5 -19. ] 
colordata = [ 0. 121. 74. 42. 8. 0.] 

Теперь, по-видимому, pcolormesh хочет, чтобы его данные представляли собой три массива 2d. В некоторых примерах, которые я видел что-то вроде этого делается:

newxdata, newydata = np.meshgrid(xdata,ydata) 

Хорошо, но как я могу получить colordata в подобном формате? Я пробовал это так:

newcolordata, zz = np.meshgrid(colordata, xdata) 

Но я не совсем уверен, правильно ли это. Теперь, если я пытаюсь нарисовать диаграмму:

ax.pcolormesh(newxdata, newydata, newcolordata) 

я получаю то, что выглядит как this. Нет ошибок, поэтому я думаю, это хорошо. Изображение, которое он возвращает, очевидно, не похоже на то, что я хочу. Может ли кто-нибудь указать мне в правильном направлении? Является ли массив данных еще в неправильном формате?

Это должно быть все важные код:

newxdata, newydata = np.meshgrid(xdata,ydata) 
    newcolordata, zz = np.meshgrid(colordata, xdata) 

    print newxdata 
    print newydata 
    print newcolordata 

    diagram = plt.figure() 







    ax = diagram.add_subplot(111) 

    xformat = DateFormatter('%d/%m/%Y') 

    ax.xaxis_date() 




    plot1 = ax.pcolormesh(newxdata, newydata, newcolordata) 

    ax.set_title("A butterfly diagram of sunspots between dates %s and %s" % (date1, date2)) 

    ax.autoscale(enable=False) 

    ax.xaxis.set_major_formatter(xformat) 
    diagram.autofmt_xdate() 



    if command == "save": 
     diagram.savefig('diagrams//'+name+'.png') 

Edit: я заметил, что цвета действительно соответствуют номеру. Теперь мне просто нужно превратить эти бары одинакового размера в точки.

+0

чтении принят ответ, я думаю, что вопрос вводит в заблуждение: если вы хотите гистограмм, вы не должны смотреть на pcolormesh, meshgrid ... которые связаны с показывая скаляры интерполяцией над регулярной сеткой – SAAD

ответ

0

Если вы хотите использовать точки, используйте scatter. pcolormesh рисует сетку. scatter рисует маркеры по цвету и/или масштабируется по размеру.

Например:

import matplotlib.pyplot as plt 

xdata = [695422.,695423.,695424.,695425.,695426.,695426.] 
ydata = [0.,-15.4,-15.3,-15.7,-15.5,-19.] 
colordata = [0.,121.,74.,42.,8.,0.], 

fig, ax = plt.subplots() 
ax.scatter(xdata, ydata, c=colordata, marker='o', s=200) 
ax.xaxis_date() 
fig.autofmt_xdate() 
plt.show() 

enter image description here


Edit: Это звучит, как вы хотите, чтобы бина данные и просуммировать области внутри каждой ячейки.

Если это так, вы можете использовать hist2d для этого. Если вы укажете области солнечных пятен как weights на гистограмме, области внутри каждого бункера будут суммированы.

Вот пример (данные отсюда: http://solarscience.msfc.nasa.gov/greenwch.shtml, в частности, this file, отформатирован as described here). Большинство из них читает данные. Обратите внимание, что я указываю vmin, а затем используя im.cmap.set_under('none'), чтобы отображать что-либо под этим значением как прозрачное.

Возможно, что я полностью не понимаю данные здесь. Единицы могут быть совершенно неверными («сырые» участки, как я думаю, составляют миллионы тысяч солнечных лучей).

from glob import glob 
import datetime as dt 
import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 

def main(): 
    files = sorted(glob('sunspot_data/*.txt')) 
    df = pd.concat([read_file(name) for name in files]) 

    date = mdates.date2num(df.date) 

    fig, ax = plt.subplots(figsize=(10, 4)) 
    data, xbins, ybins, im = ax.hist2d(date, df.latitude, weights=df.area/1e4, 
             bins=(1000, 50), vmin=1e-6) 
    ax.xaxis_date() 
    im.cmap.set_under('none') 
    cbar = fig.colorbar(im) 

    ax.set(xlabel='Date', ylabel='Solar Latitude', title='Butterfly Plot') 
    cbar.set_label("Percentage of the Sun's surface") 

    fig.tight_layout() 
    plt.show() 

def read_file(filename): 
    """This data happens to be in a rather annoying format...""" 
    def parse_date(year, month, day, time): 
     year, month, day = [int(item) for item in [year, month, day]] 
     time = 24 * float(time) 
     hour = int(time) 
     minute_frac = 60 * (time % 1) 
     minute = int(minute_frac) 
     second = int(60 * (minute_frac % 1)) 
     return dt.datetime(year, month, day, hour, minute, second) 

    cols = dict(year=(0, 4), month=(4, 6), day=(6, 8), time=(8, 12), 
       area=(41, 44), latitude=(63, 68), longitude=(57, 62)) 
    df = pd.read_fwf(filename, colspecs=cols.values(), header=None, 
        names=cols.keys(), date_parser=parse_date, 
        parse_dates={'date':['year', 'month', 'day', 'time']}) 
    return df 

main() 

enter image description here

+0

Да, я пробовал использовать разброс, который мне показалось проще использовать. Тем не менее, у меня есть данные уже более 100 лет, и я пытаюсь построить все, что дает мне MemoryError. – user3027287

+0

Итак, я полагаю, что для этого нужно использовать либо PColorMesh, либо PColor. Последняя картинка должна выглядеть примерно так, когда я рисую все данные: http://en.wikipedia.org/wiki/File:Sunspot-bfly.gif – user3027287

+0

@ user3027287 - Ах! Хорошо, вам просто нужно сфокусировать свои данные. Я приведу пример всего за секунду. –

 Смежные вопросы

  • Нет связанных вопросов^_^