有没有一种简单的方法来使用Pandas DataFrame.plot(kind='bar')方法按列名指定条形颜色?
我有一个脚本,可以从目录中的几个不同数据文件生成多个DataFrame.例如,它做这样的事情:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pds
data_files = ['a', 'b', 'c', 'd']
df1 = pds.DataFrame(np.random.rand(4,3), columns=data_files[:-1])
df2 = pds.DataFrame(np.random.rand(4,3), columns=data_files[1:])
df1.plot(kind='bar', ax=plt.subplot(121))
df2.plot(kind='bar', ax=plt.subplot(122))
plt.show()
Run Code Online (Sandbox Code Playgroud)
使用以下输出:

不幸的是,不同图中每个标签的列颜色不一致.是否可以传入(文件名:颜色)字典,以便任何特定列始终具有相同的颜色.例如,我可以想象通过使用Matplotlib color_cycle压缩文件名来创建它:
data_files = ['a', 'b', 'c', 'd']
colors = plt.rcParams['axes.color_cycle']
print zip(data_files, colors)
[('a', u'b'), ('b', u'g'), ('c', u'r'), ('d', u'c')]
Run Code Online (Sandbox Code Playgroud)
我可以直接用Matplotlib弄清楚如何做到这一点:我只是觉得可能有一个更简单的内置解决方案.
编辑:
下面是一个部分解决方案,适用于纯Matplotlib.但是,我在IPython笔记本中使用它,将分发给非程序员同事,我想尽量减少过多的绘图代码.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pds
data_files = ['a', 'b', 'c', 'd']
mpl_colors …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Excel中创建一个非常简单的VBA函数,用于计算特定值(基于另一个单元格内容)并设置调用单元格值和内部颜色.我对值计算很好,但它是内部着色让我循环.
我可以执行以下操作来设置文本和字体颜色:
Function Test()
Application.Caller.Font.ColorIndex = 3
Test = "Hello"
End Function
Run Code Online (Sandbox Code Playgroud)
但我宁愿设置细胞内部颜色.我已经尝试了下面代码的几个不同的迭代,但这总是在调用单元格中给出一个值错误.
Function Test()
Application.Caller.Interior.ColorIndex = 3
Test = "Hello"
End Function
Run Code Online (Sandbox Code Playgroud)
无论如何,我已经看到一些其他SO帖子谈论类似的变化(例如这里),但他们的解决方案似乎并不适合我.我宁愿不使用条件格式化这样做,因为我想要一些我可以轻松地在不同的Excel文件之间传输的东西.
问题:对于 Connnection 对象的执行函数,是否可以使用返回字典而不是字典列表的生成器来执行“executemany”插入?
详细信息:我正在尝试通过核心表达式来学习 SQLAlchemy 。作为测试,我有一个相当大的数据集,通过迭代器从文件访问,我试图将其传输到 PostgreSQL 表中,但插入单个行非常慢(请参见下面的示例 1)。根据文档,如果传入字典列表而不是单个字典,则Connnection 对象的函数execute()将执行等效操作。executemany()我做了一些快速测试,实际上这种方法对于插入组来说要快得多。不幸的是,对于我的大数据集,我无法在内存中创建完整的字典列表,因此我的问题......
示例 1:以下(伪)代码对于大量数据来说非常慢
from sqlalchemy import MetaData, Table, Column
metadata = MetaData()
data = Table('data', metadata, Column...)
engine = sql.create_engine('postgresql://user:pass$@localhost/testdb')
metadata.create_all(engine)
conn = engine.connect()
ins = data.insert()
for datum in large_data_iterator:
datum_dict = do_some_proc(datum)
conn.execute(ins, datum_dict)
Run Code Online (Sandbox Code Playgroud)
因为执行可以采用多个值,所以最好for用以下生成器版本替换最终循环:
def datagen(iterator):
for datum in large_data_iterator:
datum_dict = do_some_proc(datum)
yield datum_dict
conn = engine.connect()
ins = data.insert()
conn.execute(ins, datagen(large_data_iterator))
Run Code Online (Sandbox Code Playgroud)
但是,这会引发以下异常:AttributeError:“list”对象没有属性“keys”。
有谁知道是否可以让生成器版本正常工作?或者有更好的方法来做到这一点也很棒。谢谢!
注意:我测试了一个修改后的生成器表达式,它生成作为字典列表的块(如下),并且它比单独执行的速度更快。但是,我不知道如何选择最佳的块数,并且我担心生成器代码增加的复杂性使其更容易出错。(但如果这是唯一的方法......)
def datagen(iterator): …Run Code Online (Sandbox Code Playgroud)