在matplotlib

时间:2017-02-08 12:17:11

标签: pandas numpy matplotlib

我有一个numpy数组列表,每个数组可能有不同数量的元素,例如:

[array([55]),
 array([54]),
 array([], dtype=float64),
 array([48, 55]),]

我想绘制这个,其中每个数组都指定了横坐标(x值),例如[1,2,3,4],以便绘图应显示以下几点:[[1,55], [2, 54], [4, 48], [4, 55]]。 有没有办法用matplotlib做到这一点?或者我如何首先使用numpy或pandas转换数据,以便可以绘制它?

5 个答案:

答案 0 :(得分:5)

你想要做的是链接原始数组并生成一个带有“abscissas”的新数组。有许多方法可以连接,其中最有效的方法是使用 itertools.chain

import itertools
from numpy import array

x = [array([55]), array([54]), array([]), array([48, 55])]

ys = list(itertools.chain(*x))
# this will be [55, 54, 48, 55]

# generate abscissas
xs = list(itertools.chain(*[[i+1]*len(x1) for i, x1 in enumerate(x)])) 

现在您可以使用matplotlib轻松绘图,如下所示

import matplotlib.pyplot as plt
plt.plot(xs, ys)

答案 1 :(得分:1)

如果您想为不同的数据组设置不同的标记(颜色会自动按matplotlib循环):

import numpy as np
import matplotlib.pyplot as plt

markers = ['o', #'circle',
           'v', #'triangle_down',
           '^', #'triangle_up',
           '<', #'triangle_left',
           '>', #'triangle_right',
           '1', #'tri_down',
           '2', #'tri_up',
           '3', #'tri_left',
           '4', #'tri_right',
           '8', #'octagon',
           's', #'square',
           'p', #'pentagon',
           'h', #'hexagon1',
           'H', #'hexagon2',
           'D', #'diamond',
           'd', #'thin_diamond'
           ]

n_markers = len(markers)

a = [10.*np.random.random(int(np.random.random()*10)) for i in xrange(n_markers)]

fig = plt.figure()
ax = fig.add_subplot(111)
for i, data in enumerate(a):
    xs = data.shape[0]*[i,]  # makes the abscissas list
    marker = markers[i % n_markers] # picks a valid marker
    ax.plot(xs, data, marker, label='data %d, %s'%(i, marker))

ax.set_xlim(-1, 1.4*len(a))
ax.set_ylim(0, 10)
ax.legend(loc=None)
fig.tight_layout()

Graph with different markers 请注意,y比例的限制是硬编码的,因此会相应更改。 1.4*len(a)旨在为图例的图表右侧留出空间。

上面的示例在x=0(将是深蓝色圆圈)中没有任何意义,因为其数据集的随机分配大小为零,但如果您不这样做,则可以轻松放置+1我想使用x=0

答案 2 :(得分:1)

当数组为空或短于列表中最长的数组时,使用pandas创建一个nansy数组,插入nans ...

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

arr_list = [np.array([55]),
            np.array([54]),
            np.array([], dtype='float64'),
            np.array([48, 55]),]

df = pd.DataFrame(arr_list)
list_len = len(df)
repeats = len(list(df))
vals = df.values.flatten()
xax = np.repeat(np.arange(list_len) + 1, repeats)
df_plot = pd.DataFrame({'xax': xax, 'vals': vals})
plt.scatter(df_plot.xax, df_plot.vals);

答案 3 :(得分:0)

public class OrmLiteDbHelper extends OrmLiteSqliteOpenHelper { private static final String DATABASE_NAME = "Database_db"; private static final int DATABASE_VERSION = 1; public SQLiteDatabase sqLiteDatabase; private Context mContext; public OrmLiteDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); this.mContext = mContext; try { sqLiteDatabase = getWritableDatabase(); } catch (Exception e) { e.printStackTrace(); } } @Override public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) { sqLiteDatabase = database; try { TableUtils.createTable(connectionSource, TableSet.class); } catch (SQLException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) { try { TableUtils.dropTable(connectionSource, TableSet.class, false); onCreate(database, connectionSource);}catch (Exception e){ e.printStackTrace();} } 列表:

x

答案 4 :(得分:0)